Antworten:
ls *.txt | xargs cat >> all.txt
funktioniert möglicherweise etwas besser, da es an all.txt angehängt wird, anstatt es nach jeder Datei neu zu erstellen.
Übrigens cat *.txt >all.txt
würde auch funktionieren. :-)
Wenn einige Ihrer Dateinamen ', "oder Leerzeichen enthalten, xargs
schlägt dies aufgrund des Trennzeichenproblems fehl
Laufen Sie im Allgemeinen niemals xargs
ohne -0, da es eines Tages zurückkommt und Sie beißt.
Erwägen Sie stattdessen die Verwendung von GNU Parallel:
ls *.txt | parallel cat > tmp/all.txt
oder wenn Sie es vorziehen:
ls *.txt | parallel cat >> tmp/all.txt
Weitere Informationen zu GNU Parallel finden Sie unter http://www.youtube.com/watch?v=OpaiGYxkSuQ
all.txt
ist eine Datei im selben Verzeichnis, weshalb cat verwirrt ist, wenn sie von derselben Datei in dieselbe Datei schreiben möchte.
Auf der anderen Seite:
ls *.txt | xargs cat > tmp/all.txt
Dies liest aus Textdateien in Ihrem aktuellen Verzeichnis in die all.txt in einem Unterverzeichnis (nicht im Lieferumfang enthalten *.txt
).
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, befehlszeilengroße Blöcke aufgeteilt wird. Stellen Sie sich also eine Situation vor, in der sich Hunderttausende von TXT-Dateien im Verzeichnis befinden. ls *.txt
wird versagen. Sie müssten tun
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.txt$
in diesem Fall ist ein regelmäßiger alles Ausdruck entspricht Enden in .txt (so ist es nicht genau wie *.txt
, da , wenn Sie eine Datei mit dem Namen haben atxt
, dann *.txt
wäre es nicht passen, aber der reguläre Ausdruck würde.)
Die Verwendung eines anderen Pfads ist darauf zurückzuführen, dass all.txt, wie in anderen Antworten angegeben, mit dem Muster übereinstimmt, *.txt
sodass ein Konflikt zwischen Eingabe und Ausgabe besteht.
Beachten Sie , dass Sie dies tun möchten , wenn Sie Dateien mit '
Namen haben (und dies könnte die Ursache des unmatched single quote
Fehlers sein)
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
Die Option --null weist grep an, die Ausgabe getrennt durch ein \0
(aka null) -Zeichen anstelle der Standard-Newline zu verwenden, und die -0
Option `xargs weist es an, die Eingabe im gleichen Format zu erwarten. Dies würde auch dann funktionieren, wenn Sie Dateinamen mit Zeilenumbrüchen hätten.
ls
hierfür . Wenn Sie wirklich nicht verwenden können,cat *.txt >all.txt
versuchen Sieprintf '%s\0' *.txt | xargs -r0 cat >all
und dannmv all all.txt
, um zu vermeiden, dass sich die Datei selbst referenziert.