例如,我在某個目錄中尋找檔案和目錄:
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
假定使用-printf
GNU ( 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
,或未取消設定NOMATCH
shell 選項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
( -F
and-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 命令的格式。