431 Stimmen

Verkettung mehrerer Textdateien in eine einzige Datei in Bash

Was ist der schnellste und pragmatischste Weg, um alle *.txt-Dateien in einem Verzeichnis zu einer großen Textdatei zusammenzufassen?

Derzeit verwende ich Windows mit cygwin, so dass ich Zugriff auf BASH habe.

Ein Windows-Shell-Befehl wäre auch schön, aber ich bezweifle, dass es einen solchen gibt.

754voto

Robert Greiner Punkte 28052

Damit wird die Ausgabe an all.txt angehängt

cat *.txt >> all.txt

Dies überschreibt all.txt

cat *.txt > all.txt

208voto

Chinmay Kanchi Punkte 58341

Denken Sie daran, dass bei allen bisher vorgestellten Lösungen die Shell die Reihenfolge bestimmt, in der die Dateien verkettet werden. Für Bash, IIRC, ist das die alphabetische Reihenfolge. Wenn die Reihenfolge wichtig ist, sollten Sie die Dateien entweder entsprechend benennen (01Datei.txt, 02Datei.txt usw.) oder jede Datei in der Reihenfolge angeben, in der sie verkettet werden soll.

$ cat file1 file2 file3 file4 file5 file6 > out.txt

33voto

Greg Hewgill Punkte 882617

Der Windows-Shell-Befehl type kann dies tun:

type *.txt > outputfile.txt

Typ type Befehl schreibt auch Dateinamen auf stderr, die nicht von der > Operator umleiten (wird aber auf der Konsole angezeigt).

30voto

Carl Norum Punkte 210051

Sie können die Windows-Shell verwenden copy um Dateien zu verketten.

C:\> copy *.txt outputfile

Aus der Hilfe:

Um Dateien anzuhängen, geben Sie eine einzelne Datei als Ziel, aber mehrere Dateien als Quelle an (mit Platzhaltern oder im Format file1+file2+file3).

19voto

jackfizee Punkte 199

Seien Sie vorsichtig, denn keine dieser Methoden funktioniert bei einer großen Anzahl von Dateien. Ich persönlich habe diese Zeile verwendet:

for i in $(ls | grep ".txt");do cat $i >> output.txt;done

EDIT: Wie jemand in den Kommentaren sagte, können Sie die $(ls | grep ".txt")$(ls *.txt)

EDIT: Dank des Fachwissens von @gnourf_gnourf ist die Verwendung von Globus ist der korrekte Weg, um über Dateien in einem Verzeichnis zu iterieren. Folglich sind blasphemische Ausdrücke wie $(ls | grep ".txt") muss ersetzt werden durch *.txt (siehe den Artikel aquí ).

Gute Lösung

for i in *.txt;do cat $i >> output.txt;done

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X