Find

具有多個 -name-execfind 只執行 -name 的最後匹配項

  • November 10, 2021

當我使用

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"** ')' \
')' -列印

也就是說,因為沒有指定動作謂詞(只有條件),所以-print會為匹配條件的文件隱式添加動作。

(順便說一句,這將列印非正常.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)取消-print上面看到的隱式動作。在這裡,你想要:

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每個文件執行一個。

引用自:https://unix.stackexchange.com/questions/102191