Warum geht das nicht?
ls *.txt | xargs cat > all.txt
(Ich möchte den Inhalt aller Textdateien in einer einzigen "all.txt" -Datei zusammenfassen.) Find with -exec sollte auch funktionieren, aber ich möchte die xargs-Syntax wirklich verstehen.
Vielen Dank
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.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. :-)quelle
Wenn einige Ihrer Dateinamen ', "oder Leerzeichen enthalten,
xargs
schlägt dies aufgrund des Trennzeichenproblems fehlLaufen 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:
oder wenn Sie es vorziehen:
Weitere Informationen zu GNU Parallel finden Sie unter http://www.youtube.com/watch?v=OpaiGYxkSuQ
quelle
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:
Dies liest aus Textdateien in Ihrem aktuellen Verzeichnis in die all.txt in einem Unterverzeichnis (nicht im Lieferumfang enthalten
*.txt
).quelle
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.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 habenatxt
, 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 desunmatched single quote
Fehlers sein)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.quelle