
我試圖find
列印包含 jpg 圖像以外的文件的目錄列表,但我認為我對該-exec
選項的使用已損壞。我的環境是 Cygwin Bash。
$ find ! -iname "*.JPG$" -exec dirname
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname {}
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname;
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname ;
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname {};
find: missing argument to `-exec'
答案1
A需要以 a或 a-exec
終止。導致命令對每個找到的檔案名稱執行一次,而導致命令對所有檔案名稱執行一次。;
+
;
+
這是一個工作範例:
find ! -iname "*.JPG" -exec dirname {} \;
與您的嘗試有一些顯著的差異:
{}
和之間必須有一個空格\;
- 必須
;
轉義,因為它是 shell 元字元。 - 正如 @muru 在他的回答中指出的那樣,
-iname
採用 glob,而不是正則表達式
答案2
嘗試:
find -type f ! -iname "*.JPG" -exec dirname {} \; | sort -u
筆記;
要完成該
-exec
命令,{}
需要 a 來顯示檔案名稱應該放在哪裡和需要一個分號。因為 shell 會吃掉一個普通的分號,所以我們必須對其進行轉義,以便將其傳遞給find
.-iname
匹配全域變量,而不是正規表示式。所以,最後的結果$
可能"*.JPG$"
不是你想要的。您說您想要一個「包含 jpg 以外的檔案的目錄清單」。因此,我添加了
-type f
這一內容,以便確保我們只查看至少包含一個檔案的目錄。結果被通過
sort -u
以刪除重複項。
答案3
文法:
-exec [command] ... {} ... ;
-exec [command] ... {} ... +
由於;
是 shell 語法的一部分,因此您需要對其進行轉義,以便find
將其視為參數:
find .. -exec dirname {} \;
順便說一句,-iname
不要使用正規表示式 - 只需使用*.jpg
不帶$
.
dirname
現在我突然意識到,有了 GNU find,我們就根本不需要使用它了。反而:
find ... -printf "%h\n"