-exec選項需要的參數的順序:
find . -exec arg0 arg1 arg2 ... \;
如果加上引號
find . -exec "arg0 arg1 arg2" \;
然後 「爲arg0 ARG1 ARG2」 被視爲一個參數的參數。可以預期帶有空格的arg0 arg1 arg2
命令將存在於您的系統中,而不是名爲arg0
的參數爲arg1
和arg2
的命令。
如果你使用發現沒有sh -c
,那麼你就會有這樣的:
find . -type f -name \*.mp4 -exec 'ffprobe "{}" 2>&1 |
grep -q 1920x1080 && echo "{}"' \;
這意味着find
會尋找一個叫做ffprobe "$0" ....
命令,傳遞沒有參數 - 有沒有這樣的命令。有一個叫做ffprobe
的命令,它帶有參數,這就是你需要的。一種可能性是做這樣的事情:
find . -type f -name \*.mp4 -exec ffprobe '$0' 2>&1 |
grep -q 1920x1080 && echo '{}' \;
然而,這是不行的,因爲輸出重定向2>&1
和管道|
和命令序列算&&
都會比你想要的東西區別對待。
爲了解決這個問題,他們使用另一個shell。這類似於創建一個腳本做的工作:
find . -type f -name \*.mp4 -exec myscript {} \;
但不是一個單獨的腳本,一切都在一行上。
部分原因也是由於'unistd.h'中的'exec *'函數造成的。很有可能(我還沒有讀過GNU find的源代碼),他們使用的是類似execve的東西,所以你是正確的,因爲這些函數的第一個參數必須是二進制(可執行文件)才能運行。該字符串將被視爲一個大的可執行文件,並會導致錯誤。它們大部分(如果不是全部的話)會爲傳遞的其餘參數採用一個字符串數組或可變數量的參數。 – 2013-05-12 16:31:30
我真的很驚訝$ 0被解釋爲它在單引號內。爲什麼這個工作? – 2013-05-12 17:12:51
@SandraSchlichting:'$ 0'在另一個shell內部被替換,它看不到單引號。 – 2013-05-12 17:15:50