it-swarm.com.de

Wie füge ich alle (Text-) Dateien in einem Verzeichnis zu einem zusammen?

Ich habe 14 Dateien, die alle Teile eines Textes sind. Ich möchte sie zu einem zusammenführen. Wie geht das?

99
Ivan

Dies ist technisch gesehen das, was cat ("verketten") tun soll, obwohl die meisten Leute es nur zum Ausgeben von Dateien an stdout verwenden. Wenn Sie ihm mehrere Dateinamen geben, werden alle nacheinander ausgegeben, und Sie können diese in eine neue Datei umleiten. Verwenden Sie für alle Dateien einfach * (oder /path/to/directory/* wenn Sie noch nicht im Verzeichnis sind) und Ihre Shell erweitert es auf alle Dateinamen

$ cat * > merged-file
182
Michael Mrozek

Wenn sich Ihre Dateien nicht im selben Verzeichnis befinden, können Sie vor der Verkettung den Befehl find verwenden:

find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file

Sehr nützlich, wenn Ihre Dateien bereits bestellt sind und Sie sie zusammenführen möchten, um sie zu analysieren.


Tragbarer:

find /path/to/directory/ -name *.csv -exec cat {} + > merged.file

Dies kann die Dateireihenfolge beibehalten oder nicht.

27
3nrique0

Der Befehl

$ cat * > merged-file

hat tatsächlich den unerwünschten Nebeneffekt, dass 'zusammengeführte Datei' in die Verkettung aufgenommen wird und eine außer Kontrolle geratene Datei erstellt wird. Um dies zu umgehen, schreiben Sie entweder die zusammengeführte Datei in ein anderes Verzeichnis.

$ cat * > ../merged-file

oder verwenden Sie eine Musterübereinstimmung, bei der die zusammengeführte Datei ignoriert wird.

$ cat *.txt > merged-file
10

Wie die anderen von hier sagen ... Sie können cat verwenden

Nehmen wir an, Sie haben:

~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD

Und du willst nur file01 bis file03 und fileA bis fileC:

cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file

Oder mit Klammererweiterung:

cat ~/file0{1..3} ~/file{A..C} > merged-file

Oder verwenden Sie eine schickere Zahnspangenerweiterung:

cat ~/file{0{1..3},{A..C}} > merged-file

Oder Sie können die Schleife for verwenden:

for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
10
Florin Idita

Sie können das pattern einer Datei angeben und dann alle wie folgt zusammenführen:

cat *pattern* >> mergedfile
0
user182845

Eine andere Option ist sed:

sed r 1.txt 2.txt 3.txt > merge.txt 

Oder...

sed h 1.txt 2.txt 3.txt > merge.txt 

Oder...

sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here

Oder ohne Weiterleitung ...

 sed wmerge.txt 1.txt 2.txt 3.txt

Beachten Sie, dass in der letzten Zeile auch merge.txt geschrieben wird (nicht wmerge.txt!). Sie können w "merge.txt" verwenden, um Verwechslungen mit dem Dateinamen zu vermeiden, und -n für die stille Ausgabe.

Natürlich können Sie die Dateiliste auch mit Platzhaltern kürzen. Beispielsweise können Sie bei nummerierten Dateien wie in den obigen Beispielen den Bereich mit geschweiften Klammern wie folgt angeben:

sed -n w"merge.txt" {1..3}.txt
0
Harini