どのような変更が行われたかを報告するコマンドライン Perl コマンドを取得します。

どのような変更が行われたかを報告するコマンドライン Perl コマンドを取得します。

次のコマンド (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置換が行われるかどうかに関係なく、ファイルが書き換えられることに注意してください。

;コマンドを終了するために使用しないでください-execperl一度に複数のファイルを処理できるため、ファイルごとに 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"' _ '{}' \;

関連情報