
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 perl
die Dateien neu geschrieben werden, unabhängig davon, ob sie ersetzt werden oder nicht.
Nicht ;
zum Beenden des -exec
Befehls verwenden. perl
Kann 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 -pi
durch .-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 http
Vorkommen).
Antwort2
Sie können einen Bericht darüber erhalten, welche Dateien an Perl gesendet werden, indem Sie sowohl als auch -print
verwenden -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"' _ '{}' \;