如何在「find」指令的輸出中標記目錄?

如何在「find」指令的輸出中標記目錄?

例如,我在某個目錄中尋找檔案和目錄:

ubuntu@example:/etc/letsencrypt$ sudo find . -name example.com*
./archive/example.com
./renewal/example.com.conf
./live/example.com
ubuntu@example:/etc/letsencrypt$ 

我如何標記上面輸出中的目錄./archive/example.com./live/example.com

答案1

使用以下命令列印文件類型和名稱-printf "%y %p\n"

$ sudo find . -name 'example.com*' -printf "%y %p\n"
d ./archive/example.com
f ./renewal/example.com.conf
d ./live/example.com

假定使用-printfGNU ( Linux 系統上find最常見的實作)。find

答案2

找兩次:

echo 'directories'
find . -name 'example.com*'   -type d

echo 'non-directories'
find . -name 'example.com*' ! -type d

也要注意用於名稱測試的模式的引用。如果沒有引號,shell 將在呼叫之前嘗試將字串與目前目錄中的名稱進行比對find。如果在 shellfailglob中設定了 shell 選項bash,或未取消設定NOMATCHshell 選項zsh,則不符合任何內容的無引號的通配模式將從 shell 中產生錯誤,並且find根本不會被呼叫。


或者,只需在目錄路徑名末尾輸出斜線(這就是ls -p表示目錄的方式):

find . -name 'example.com*' \( -type d -exec printf '%s/\n' {} \; -o -print \)

上面的find命令先測試名稱是否正確。如果是,而且它是一個目錄,它會呼叫printf輸出目錄的路徑名,末尾帶有斜線。如果不是目錄,-print則用於按原樣輸出路徑名。

對於 GNU find,該-exec printf '%s/\n' {} \;位元可以替換為-printf '%p/\n'.

使用 standard find,您還可以盡可能少地-exec printf '%s/\n' {} +調用外部printf實用程序,但這意味著目錄可能會最後輸出,或者至少是批量輸出。


另一種選擇是實際使用來ls -p區分目錄與其他文件類型。使用ls -p,目錄將帶有尾隨/字符列出,就像上面一樣。

find . -name 'example.com*' -exec ls -f -d -p {} +

我在這裡使用是-f為了避免對ls輸出進行排序,並-d避免列出內容目錄。

你可以使用ls -F而不是ls -p也放其他標記目錄以外的檔案類型。例如,可執行檔將帶有後綴*,符號連結將帶有後綴@

-p( -Fand-f-d) 都是該實用程式的標準選項ls

答案3

你可以file這樣使用:

sudo find . -name "example.com*" -print0 | xargs  -0 sudo file

輸出範例:

$ sudo find .  -name "example.com*"   -print0 | xargs  -0 sudo file
./example.com. big file: ASCII text
./example.com-dir:       directory
./example.com:           empty

答案4

如果您想要一個更便攜的選項,可以在沒有 gnu 選項的情況下與 *nix 風格一起使用(例如 macOS),您可以透過以下方式-printf在目錄路徑末尾添加斜線:ls

find . -name "example.com*" -exec ls -dF {} \;

例子:

$ sudo find . -name "example.com*" -exec ls -dF {} \;
./archive/example.com/
./renewal/example.com.conf
./live/example.com/

這也恰好是一種更適合進一步管道傳輸到更多 UNIX 命令的格式。

相關內容