Linux

如何在“find”命令的輸出中標記目錄?

  • June 1, 2021

例如,我在某個目錄中查找文件和目錄:

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是上面輸出中的目錄?

列印文件類型和名稱-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

使用-printf假定 GNU ( Linux 系統上find最常見的實現)。find

查找兩次:

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

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

還要注意用於名稱測試的模式的引用。如果沒有引號,shell 會在呼叫之前嘗試將字元串與目前目錄中的名稱進行匹配find。如果在failglobshell 中設置了 shell 選項bash,或者如果未設置NOMATCHshell 選項 in zsh,則不匹配任何內容的未加引號的通配模式將在 shell 中生成錯誤,並且find根本不會被呼叫。


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

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

上述find命令首先測試名稱是否正確。如果是,並且它是一個目錄,它會呼叫printf以輸出目錄的路徑名,並在末尾加上一個斜杠。如果它不是目錄-print,則用於按原樣輸出路徑名。

在 GNUfind中,該-exec printf '%s/\n' {} \;位可以替換為-printf '%p/\n'.

使用標準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-F(and -f)都是該實用程序-d的標準選項。ls

引用自:https://unix.stackexchange.com/questions/652076