Find具有多個
具有多個 -name
和 -exec
的find
只執行 -name
的最後匹配項
當我使用
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
它找到所有類型的文件。但是當我
-exec
在最後添加時:find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} \;
它似乎只列印
.txt
文件。我究竟做錯了什麼?注意:使用 MINGW (Git Bash)
**尋找 。-type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"**
簡稱:
**尋找 。**'(' '(' **-type f** -a **-name "*.htm*"** ')' **-o** \ '(' **-name "*.js*"** ')' **-o** \ '(' **-name "*.txt"** ')' \ ')' -列印
也就是說,因為沒有指定動作謂詞(只有條件),所以
(順便說一句,這將列印非正常
.js
文件(-type f
僅適用於.htm
文件))。儘管:
**尋找 。-type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \ -exec sh -c 'echo "$0"' {} \;**
簡稱:
**尋找 。**'(' **-type f** -a **-name "*.htm*"** ')' **-o** \ '(' **-name "*.js*"** ')' **-o** \ '(' **-name "*.txt"** -a **-exec sh -c 'echo "$0"' {} \;** ')'
對於
find
(就像在許多語言中一樣),AND(-a
;省略時隱式)優先於OR(-o
),並且添加顯式動作謂詞(此處-exec
)取消find . -type f '(' -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ')' \ -exec sh -c 'echo "$0"' {} \;
或者:
find . -type f '(' -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ')' -exec sh -c ' for i do echo "$i" done' sh {} +
避免
sh
每個文件執行一個。