回答:
見つける 。-type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt"
の略です:
見つける 。\(\(- type f -a -name "* .htm *" \)- o \ \(- name "* .js *" \)- o \ \(- name "* .txt" \)\ \)-a -print
つまり、アクションの述語が指定されていないため(条件のみ)、-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
ファイルごとに1つ実行することを避けるため。
それは暗黙の括弧です。明示的な括弧を追加します。\(
\)
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c 'echo "$0"' {} \;
またはxargsを使用します(xargsが好きですが、簡単だと思いますが、明らかにポータブルではありません)。
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -print0 | xargs -0 -n1 echo
*.js*
*.txt