このデモでは、 sh -c 'echo first; false'
を使用します (または true
) 最初の -exec
.これにより、出力が得られ、選択された終了コードの効果も得られます。次に echo second
2つ目に使用します。現在のディレクトリに 1 つのファイルがあるとします。
$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
このタイプの実際のコマンドは次のようになります:
find . -type f \( -exec command1 \; -false -o -exec command2 \; \)
2 番目のセットでは、エスケープされた括弧が 2 つの -exec
をグループ化します。 条項。 -false
それらの間でテスト状態を「false」に強制し、-o
次の式 (2 番目の -exec
) -false
のために評価される .
man find
から :
expr1 expr2
連続する 2 つの式は、暗黙の「and」で結合されていると見なされます。 expr1 が false の場合、expr2 は評価されません。
expr1 -a expr2
expr1 expr2 と同じ。
expr1 -o expr2
または; expr1 が true の場合、expr2 は評価されません。
エラーコード0
が原因でcmd2の実行を防ぐことができるcmd1について問題にならない場合 :
find . -exec cmd1 \; -exec cmd2 \;
両方のコマンドを常に実行する唯一の確実な方法は、 find
を使用することです コマンドを順番に実行するシェルを呼び出します:
find . -exec bash -c 'cmd1; cmd2' filedumper {} \;
cmd1 と cmd2 を実行するスクリプトを作成してもかまわない場合は、次のとおりです。
find . -exec myscript {} \;
または
find . -exec myscript {} +
使用する \;または + myscript が一度に複数のファイルを処理できるかどうかによって異なります (ファイル名にスペースが含まれている場合など)。
私の経験では、自分が行っていたことをスクリプトに入れることは、ほとんどの場合、それだけの価値がありました。一度やらなければならない場合は、もう一度やらなければなりません。
しかし、巧妙なトリックは、検索結果を 内側 に配置することです。 スクリプト:
if [ $# -gt 0 ]; then
for each; do
touch $each
done
else
find . -exec $0 {} +
fi
次に、myscript は、引数として指定したファイルに対して動作しますが、引数を指定しないと、現在のディレクトリから find を実行し、見つかったファイルに対して自分自身を呼び出します。これにより、 find -exec がスクリプトで定義したシェル関数を呼び出すことができないという事実を回避できます。