ls *.txt | xargs cat >> all.txt
Möglicherweise funktioniert es etwas besser, da es an all.txt angehängt wird, anstatt es nach jeder Datei erneut zu erstellen.
Übrigens cat *.txt >all.txt
würde auch funktionieren. :-)
Warum funktioniert das nicht?
ls *.txt | xargs cat > all.txt
(Ich möchte den Inhalt aller Textdateien in einer einzigen 'all.txt'-Datei zusammenfassen.) Find mit -exec sollte ebenfalls funktionieren, aber ich würde wirklich gerne die xargs-Syntax verstehen.
Vielen Dank
ls *.txt | xargs cat >> all.txt
Möglicherweise funktioniert es etwas besser, da es an all.txt angehängt wird, anstatt es nach jeder Datei erneut zu erstellen.
Übrigens cat *.txt >all.txt
würde auch funktionieren. :-)
Wenn einige Ihrer Dateinamen ',' enthalten, schlägt der Speicherplatz xargs
aufgrund des Separatorproblems fehl
Laufen Sie im Allgemeinen niemals xargs
ohne -0, da es eines Tages zurückkommen und Sie beißen wird.
Erwägen Sie stattdessen die Verwendung von GNU Parallel:
ls *.txt | parallel cat > tmp/all.txt
oder wenn Sie es bevorzugen:
ls *.txt | parallel cat >> tmp/all.txt
Weitere Informationen zu GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ
all.txt
Ist eine Datei im selben Verzeichnis, so wird cat verwirrt, wenn sie aus derselben Datei in dieselbe Datei schreiben möchte.
Auf der anderen Seite:
ls *.txt | xargs cat > tmp/all.txt
Dies wird aus Textdateien in Ihrem aktuellen Verzeichnis in die Datei all.txt in einem Unterverzeichnis (nicht im Lieferumfang enthalten *.txt
) gelesen .
Sie könnten auch auf eine Begrenzung der Befehlszeilenlänge stoßen. Ein Grund für die Verwendung xargs
ist, dass die Eingabe in sichere Befehlszeilengröße aufgeteilt wird. Stellen Sie sich eine Situation vor, in der Sie Hunderttausende TXT-Dateien im Verzeichnis haben. ls *.txt
wird versagen. Sie müssten es tun
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.txt$
In diesem Fall stimmt ein regulärer Ausdruck mit allem überein, was mit .txt endet (es ist also nicht genau so *.txt
, da, wenn Sie eine Datei aufgerufen haben atxt
, *.txt
dies nicht der Fall sein würde, der reguläre Ausdruck jedoch.)
Die Verwendung eines anderen Pfads ist darauf zurückzuführen, dass all.txt, wie andere Antworten darauf hingewiesen haben, mit dem Muster übereinstimmt, *.txt
sodass ein Konflikt zwischen Eingabe und Ausgabe besteht.
Wenn Sie Dateien '
im Namen haben (dies könnte die unmatched single quote
Fehlerursache sein), sollten Sie dies tun
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
Mit der Option --null wird grep angewiesen, die Ausgabe durch ein \0
(bekannt als Nullzeichen) getrenntes Zeichen anstelle der standardmäßigen Newline zu verwenden, und die -0
Option für `xargs weist sie an, ihre Eingabe im selben Format zu erwarten. Dies funktioniert auch, wenn Sie Dateinamen mit Zeilenumbrüchen enthalten.