讓 find 中的 -exec 選項發揮作用

讓 find 中的 -exec 選項發揮作用

我試圖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 {} \;

與您的嘗試有一些顯著的差異:

  1. {}和之間必須有一個空格\;
  2. 必須;轉義,因為它是 shell 元字元。
  3. 正如 @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"

相關內容