私は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
ですか?ありがとう!
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 "$@"
)は(を除く$0
)すべての引数をループするので、代わりに_
beのようなものを$0
使用$0
して、まったく使用しない方が簡単です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加