使用しているとき
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)を使用する
承認された回答:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
の略:
find . ( ( -type f -a -name "*.htm*" ) -o ( -name "*.js*" ) -o ( -name "*.txt" ) ) -a -print
つまり、アクションがないためです。 述語が指定されています(条件のみ )、-print
条件に一致するファイルに対してアクションが暗黙的に追加されます。
(ちなみに、それは非正規の.js
を出力します ファイル(-type f
.htm
にのみ適用されます ファイル))。
一方:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} ;
の略:
find . ( -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 {} +
1つのsh
の実行を回避するには ファイルごと。