find -print0 |内部コマンドは xargs -0 sh -c を実行します。

find -print0 |内部コマンドは xargs -0 sh -c を実行します。

私はfind . -type f -print0 | xargs -0 sh -cこのような一連のコマンドを実行するために使用します

find . -type f \
exec grep -q `filter` \
-print0 | xargs -0 sh -c '
sed -i.bak s/this/that/g ${0}
git diff --no-index /path/to/${0}.bak /path/to/${0} >> my.patch
rm ${0}.bak
'

検索と置換、バックアップ、パッチ、バックアップの削除のように見えましたが、パッチファイルを見ると、ほとんどの変更がなかったので、他のアプローチを試しました。

find . -type f \
exec grep -q `filter` \
-print0 | xargs -0 sed -i.bak s/this/that/g {} \;

その後、.bakすべてのファイルをバックアップフォルダに移動しました。

私は2番目のアプローチに同意します。最初のアプローチでは、私がどこで間違っているのか知りたいです。すべてのコマンドが内部で実行されないのはなぜですかsh -c?ありがとうございます!

答え1

xargsできるだけ多くの引数を使用してコマンドを実行しようとしますが、そのうちの1つだけを使用します。以下はすべてのパラメータを処理します。

xargs -0 sh -c '
for i
do
sed -i.bak s/this/that/g "$i"
git diff --no-index /path/to/"$i".bak /path/to/"$i" >> my.patch
rm "$i".bak
done
' _ 

for i(またはfor i in "$@")は各引数(除く)を繰り返すので、代わりにbeのようなものを使用し、まったく使用しない方が$0簡単です。_$0$0

関連情報