Dies ist meistens nicht zum Thema, aber Sie könnten verwenden
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
Der Hauptvorteil hier (gegenüber ... xargs ... -I {} ... sed ...
) ist die Geschwindigkeit: Sie vermeiden es, sed
10 Millionen Mal aufzurufen . Es wäre noch schneller, wenn Sie die Verwendung von Python vermeiden könnten (da Python relativ langsam ist), daher ist Perl möglicherweise die bessere Wahl für diese Aufgabe. Ich bin nicht sicher, wie ich das Äquivalent bequem mit Perl machen soll.
Dies funktioniert so, dass xargs
Python mit so vielen Argumenten aufgerufen wird, wie auf eine einzelne Befehlszeile passen, und dies so lange, bis die Argumente (die von bereitgestellt werden ls -f *.txt
) ausgehen. Die Anzahl der Argumente für jeden Aufruf hängt von der Länge der Dateinamen und einigen anderen Dingen ab. Die fileinput.input
Funktion liefert aufeinanderfolgende Zeilen aus den Dateien, die in den Argumenten jedes Aufrufs angegeben sind, und die inplace
Option weist sie an, die Ausgabe magisch zu "fangen" und sie zum Ersetzen jeder Zeile zu verwenden.
Beachten Sie, dass die String- replace
Methode von Python keine regulären Ausdrücke verwendet. Wenn Sie diese brauchen, müssen Sie import re
und verwenden print re.sub(line, "blah", "blee")
. Es handelt sich um Perl-kompatible RegExps, eine Art stark verstärkter Versionen derjenigen, mit denen Sie arbeiten sed -r
.
bearbeiten
Wie Akira in den Kommentaren erwähnt, würde die Originalversion, bei der ein Glob ( ls -f *.txt
) anstelle des find
Befehls verwendet wird, nicht funktionieren, da Globs von der Shell ( bash
) selbst verarbeitet werden. Dies bedeutet, dass vor der Ausführung des Befehls 10 Millionen Dateinamen in die Befehlszeile eingefügt werden. Dies wird so gut wie garantiert die maximale Größe der Argumentliste eines Befehls überschreiten. Sie können xargs --show-limits
für systemspezifische Informationen dazu verwenden.
Die maximale Größe der Argumentliste wird ebenfalls berücksichtigt xargs
, wodurch die Anzahl der Argumente, die an jeden Aufruf von Python übergeben werden, entsprechend dieser Grenze begrenzt wird. Da xargs
Python noch einige Male aufgerufen os.path.walk
werden muss, spart Ihnen Akiras Vorschlag , die Dateiliste zu erstellen, wahrscheinlich etwas Zeit.
sed
für jede Datei vermeiden könnten . Ich bin nicht sicher, ob es eine Möglichkeit gibt, eine Reihe von Dateien zu öffnen, zu bearbeiten, zu speichern und zu schließensed
. Wenn es auf Geschwindigkeit ankommt, können Sie ein anderes Programm verwenden, z. B. Perl oder Python.