Holen Sie sich den Perl-Befehl zur Meldung der vorgenommenen Änderungen

Holen Sie sich den Perl-Befehl zur Meldung der vorgenommenen Änderungen

Ich verwende den folgenden Befehl (unter Solaris), um das Protokoll aus einer Reihe von Dateien zu entfernen.

find .  -name "*.txt"  -exec perl -pi  -e 's/http//g' '{}' \;

Gibt es eine Möglichkeit, eine ausführliche Ausgabe zu erhalten, sodass ich einen Bericht darüber bekomme, welche Dateien bearbeitet wurden?

Danke, Andy

Antwort1

Sie können die Anzahl der Ersetzungen pro Datei folgendermaßen ermitteln:

find . -type f -exec perl -pi -e '
    $count{$ARGV} += s/http//g;
    END {for (keys %count) {print "$_: $count{$_}\n" if $count{$_}}}' {} +

Beachten Sie, dass in dieser und in Ihrer ursprünglichen Lösung perldie Dateien neu geschrieben werden, unabhängig davon, ob sie ersetzt werden oder nicht.

Nicht ;zum Beenden des -execBefehls verwenden. perlKann mehrere Dateien gleichzeitig verarbeiten, es ist nicht erforderlich, pro Datei ein Perl aufzurufen.

Wenn Sie nur diese Ausgabe möchten, ohne die Ersetzungen tatsächlich vorzunehmen, ersetzen Sie sie im obigen Befehl einfach -pidurch .-n

Sie können auch Folgendes tun:

find . -type f -exec grep -c http /dev/null {} +

Um eine Zählung zu erhalten vonLinienenthalten http(nicht notwendigerweise dasselbe wie die Anzahl der httpVorkommen).

Antwort2

Sie können einen Bericht darüber erhalten, welche Dateien an Perl gesendet werden, indem Sie sowohl als auch -printverwenden -exec:

find .  -name "*.txt" -print -exec perl -pi  -e 's/http//g' '{}' \;

Wenn Sie herausfinden möchten, welche Dateien geändert wurden, dann etwas wie

find .  -name "*.txt" \
    -exec perl -i.bak -pe 's/http//g' '{}' \; \
    -exec sh -c 'cmp -s "$1" "$1.bak" && echo "$1" || rm "$1.bak"' _ '{}' \;

verwandte Informationen