如何在“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
是上面輸出中的目錄?
列印文件類型和名稱
-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
。如果在failglob
shell 中設置了 shell 選項bash
,或者如果未設置NOMATCH
shell 選項 inzsh
,則不匹配任何內容的未加引號的通配模式將在 shell 中生成錯誤,並且find
根本不會被呼叫。或者,只需在目錄路徑名的末尾輸出一個斜杠(這是
ls -p
表示目錄的方式):find . -name 'example.com*' \( -type d -exec printf '%s/\n' {} \; -o -print \)
上述
find
命令首先測試名稱是否正確。如果是,並且它是一個目錄,它會呼叫printf
以輸出目錄的路徑名,並在末尾加上一個斜杠。如果它不是目錄在 GNU
find
中,該-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