Warum geht das nicht? "Ls * .txt | xargs cat> all.txt ”(alle Dateien in einem einzigen txt-Dokument)

20

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

ajo
quelle
1
Obwohl nicht verwendet lshierfür . Wenn Sie wirklich nicht verwenden können, cat *.txt >all.txtversuchen Sie printf '%s\0' *.txt | xargs -r0 cat >allund dann mv all all.txt, um zu vermeiden, dass sich die Datei selbst referenziert.
Tripleee

Antworten:

27

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.txtwürde auch funktionieren. :-)

Janne Pikkarainen
quelle
6
Die cat * .txt> all.txt ist natürlich besser. Vielen Dank
ajo
1
Die ... | xargs cat >> all.txt oder> all.txt geben bei xargs immer einen Fehler zurück: Unübertroffenes einfaches Anführungszeichen ... Liegt es daran, dass xargs alles danach als Befehl nimmt?
ajo
1
Haben Sie Dateinamen mit Leerzeichen? Wenn ja, dann verwenden Sie stattdessen etwas wie "find / your / path -iname '* .txt' -print0 | xargs -0 cat >> all.txt"
Janne Pikkarainen
1
nein, ich habe alle Dateinamensräume durch ersetzt . Aber wenn man bedenkt, werden einige Dateinamen wahrscheinlich einfache Anführungszeichen enthalten, wie in listing_O'Connor .txt, dies könnte das Problem sein!
ajo
Ja, das ist dann das Problem. :) Am einfachsten und sichersten ist es, find mit -print0 in Kombination mit xargs -0 zu verwenden. Die gesamte Kette verwendet dann das Nullzeichen als Trennzeichen und Leerzeichen und Sonderzeichen werden automatisch berücksichtigt.
Janne Pikkarainen
3

Wenn einige Ihrer Dateinamen ', "oder Leerzeichen enthalten, xargsschlägt dies aufgrund des Trennzeichenproblems fehl

Laufen Sie im Allgemeinen niemals xargsohne -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

Ole Tange
quelle
1

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).

Jeremy Smyth
quelle
Immer noch der folgende Fehler: xargs: nicht übereinstimmendes einfaches Anführungszeichen; Standardmäßig sind Anführungszeichen etwas Besonderes für xargs, es sei denn, Sie verwenden die Option -0
ajo
1
Haben Sie eine TXT-Datei mit einem einfachen Anführungszeichen im Namen?
Jeremy Smyth
0

Sie könnten auch auf eine Begrenzung der Befehlszeilenlänge stoßen. Ein Grund für die Verwendung xargsist, 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 *.txtwird 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 *.txtwä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, *.txtsodass 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 quoteFehlers 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 -0Option `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.

Brian Minton
quelle