
次のコマンド (Solaris 上) を使用して、一連のファイルからプロトコルを削除します。
find . -name "*.txt" -exec perl -pi -e 's/http//g' '{}' \;
どのファイルが編集されたかのレポートを取得できるように、詳細な出力を取得する方法はありますか?
ありがとう、アンディ
答え1
ファイルごとの置換数を取得するには、次のようにします。
find . -type f -exec perl -pi -e '
$count{$ARGV} += s/http//g;
END {for (keys %count) {print "$_: $count{$_}\n" if $count{$_}}}' {} +
この場合も、元のソリューションの場合も、perl
置換が行われるかどうかに関係なく、ファイルが書き換えられることに注意してください。
;
コマンドを終了するために使用しないでください-exec
。perl
一度に複数のファイルを処理できるため、ファイルごとに 1 つの perl を呼び出す必要はありません。
実際に置換を行わずにその出力のみが必要な場合は、上記のコマンドで を-pi
に置き換えるだけです。-n
次のようなこともできます:
find . -type f -exec grep -c http /dev/null {} +
カウントを取得するには行含むhttp
(必ずしも出現回数と同じではありませんhttp
)。
答え2
-print
と の両方を使用すると、perl に送信されたファイルのレポートを取得できます-exec
。
find . -name "*.txt" -print -exec perl -pi -e 's/http//g' '{}' \;
どのファイルが変更されたか知りたい場合は、次のようにします。
find . -name "*.txt" \
-exec perl -i.bak -pe 's/http//g' '{}' \; \
-exec sh -c 'cmp -s "$1" "$1.bak" && echo "$1" || rm "$1.bak"' _ '{}' \;