Warum funktioniert das nicht? "ls * .txt | xargs cat> all.txt" (alle Dateien in ein einzelnes TXT-Dokument)

29774
ajo

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

18

4 Antworten auf die Frage

25
Janne Pikkarainen

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

Die Katze * .txt> all.txt ist natürlich besser. Vielen Dank ajo vor 13 Jahren 5
Die ... | xargs cat >> all.txt oder> all.txt geben immer einen Fehler mit xargs zurück: unübertroffenes einfaches Anführungszeichen ... Liegt es daran, dass xargs alles danach als Befehl akzeptiert? ajo vor 13 Jahren 0
Haben Sie Dateinamen mit Leerzeichen? Wenn ja, verwenden Sie stattdessen etwas wie "find / your / path -iname '* .txt' -print0 | xargs -0 cat >> all.txt" Janne Pikkarainen vor 13 Jahren 1
Nein, ich habe alle Dateinamen mit _ ersetzt. Aber wenn man daran denkt, einige Dateinamen enthalten wahrscheinlich einfache Anführungszeichen wie in Listing_O'Connor_.txt, dies könnte das Problem sein! ajo vor 13 Jahren 1
Ja, das ist dann das Problem. :) Die einfachste und am besten geeignete Methode ist, find mit -print0 in Kombination mit xargs -0 zu verwenden. Die gesamte Kette verwendet dann NULL-Zeichen als Trennzeichen. Whitespace- und Sonderzeichen werden automatisch berücksichtigt. Janne Pikkarainen vor 13 Jahren 0
In der Tat: Nachdem Sie die Anführungszeichen in einigen Dateinamen über "s / '/ _ / g" * .txt entfernt haben, funktioniert der Befehl OK !! Aber könnte es von xargs aus über eine Option gemacht werden ??? ajo vor 13 Jahren 0
OK, find ist auch nicht schlecht ... Ich erinnere mich, ähnliche Probleme zu haben, wenn die Dateinamen Leerzeichen enthielten !! ajo vor 13 Jahren 0
find ist viel besser als ls, wenn Sie in Unterverzeichnisse rekursieren müssen. Janne Pikkarainen vor 13 Jahren 0
für letzteres: was ist mit ls -R? (abgesehen von der Verzeichniszeile ?!) ajo vor 13 Jahren 0
ls -R ist vielleicht gut für eine vom Menschen lesbare Form, aber wenn Sie mit xargs oder anderen Tools etwas anfangen müssen - nicht so sehr. Siehe, ls -R listet nicht den vollständigen Pfad zusammen mit jedem Dateinamen auf, aber find oder tree führt dies aus. Erleichtert das Scripting. Bitte ls los und verwende fortgeschrittenere Tools, wenn du Sachen schreibst oder paspelst :-) Janne Pikkarainen vor 13 Jahren 0
Dies ist möglicherweise ein sehr gefährlicher Befehl. Wenn "all.txt" bereits vorhanden ist, wird der Befehl erweitert, um den gesamten verfügbaren Festplattenspeicher zu füllen. Dan Loewenherz vor 9 Jahren 0
3
Ole Tange

Wenn einige Ihrer Dateinamen ',' enthalten, schlägt der Speicherplatz xargsaufgrund des Separatorproblems fehl

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

1
Jeremy Smyth

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 .

Noch der folgende Fehler: xargs: unübertroffenes einfaches Anführungszeichen; Standardmäßig sind Anführungszeichen speziell für xargs, sofern Sie nicht die Option -0 verwenden ajo vor 13 Jahren 0
Haben Sie eine .txt-Datei mit einer einzelnen Quote im Namen? Jeremy Smyth vor 13 Jahren 1
0
Brian Minton

Sie könnten auch auf eine Begrenzung der Befehlszeilenlänge stoßen. Ein Grund für die Verwendung xargsist, 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 *.txtwird 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, *.txtdies 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, *.txtsodass ein Konflikt zwischen Eingabe und Ausgabe besteht.

Wenn Sie Dateien 'im Namen haben (dies könnte die unmatched single quoteFehlerursache 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 -0Option für `xargs weist sie an, ihre Eingabe im selben Format zu erwarten. Dies funktioniert auch, wenn Sie Dateinamen mit Zeilenumbrüchen enthalten.