2010-01-27 14 views
193

Was ist die schnellste und pragmatische Möglichkeit, alle * .TXT-Datei in einem Verzeichnis in eine große Textdatei zu kombinieren?Verketten mehrerer Textdateien in einer einzigen Datei in Bash

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

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

Antwort

355

Dies hängt der Ausgang

cat *.txt >> all.txt 

Das überschreibt all.txt

cat *.txt > all.txt 
+18

können Sie ein Problem, wo es Katzen all.txt in all.txt läuft ... Ich habe dieses Problem mit grep manchmal, nicht sicher, ob Katze das gleiche Verhalten hat. – rmeador

+5

@rmeador Ja, das ist wahr, wenn all.txt bereits existiert, wirst du dieses Problem haben. Dieses Problem wird gelöst, indem Sie die Ausgabedatei mit einer anderen Erweiterung versehen oder die Datei all.txt in einen anderen Ordner verschieben. –

+2

Katze * .txt >> tmp; mv tmp all.txt (und stellen Sie sicher, dass all.txt nicht existiert vorher) – Renaud

18

Sie all.txt copy Windows-Shell verwenden, können Dateien verketten.

C:\> copy *.txt outputfile 

Von der Hilfe:

Dateien anhängen, um eine einzelne Datei für das Ziel angeben, sondern mehrere Dateien für Quelle (mit Wildcards oder Datei1 + Datei2 + file3-Format).

+0

Diese als IMHO sauberste Lösung mit praktisch keinen Nebenwirkungen, über die Anfänger stolpern könnten, wird leider nicht ausreichend gewürdigt :-( – Grmpfhmbl

27

Die Windows-Shell-Befehl type kann dies tun:

type *.txt >outputfile 

Typ type Befehl auch Dateinamen schreibt in stderr, die von der > Redirect Betreiber nicht erfasst werden (wird aber auf der Konsole angezeigt) .

+6

+1 für eine native Lösung – Cheezmeister

+2

Man beachte nur, dass wenn man die Ausgabedatei in das gleiche Verzeichnis wie die Originaldatei es wird eine Duplizierung verursachen, weil es auch die neue Ausgabedatei zweimal kombiniert – CathalMF

91

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

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

Der pragmatischste Weg mit der Shell ist der Befehl cat. andere Möglichkeiten umfassen,

awk '1' *.txt > all.txt 
perl -ne 'print;' *.txt > all.txt 
+1

'perl -pe 1 * .txt> all.txt' –

+0

Dies sollte die richtige Antwort für die meisten Umstände sein Wenn eine Textdatei ohne ein leere neue Zeile, die oben genannte "cat" -Methode verwendend, wird die letzte Zeile und die erste Zeile von benachbarten Dateien verketten. – mootmoot

-3

all das böse ist ....

ls | grep *.txt | while read file; do cat $file >> ./output.txt; done; 

einfach Sachen.

+6

Eeek! Tun Sie das nicht. Finden Sie. -iname "* .txt" -maxdepth 1 -exec cat { } >> out.txt \; ' –

+6

Für jeden, der sich fragt, warum man das nicht tut: http://mywiki.wooledge.org/ParsingLs – Momer

3
type [source folder]\*.[File extension] > [destination folder]\[file name].[File extension] 

Beispiel:

type C:\*.txt > C:\1\all.txt 

, dass alle TXT-Dateien im Verzeichnis C nehmen: \ Ordner und speichern Sie es in C: \ 1 Ordner mit dem Namen all.txt

oder

type [source folder]\* > [destination folder]\[file name].[File extension] 

Beispiel:

type C:\* > C:\1\all.txt 

Das wird alle Dateien übernehmen, die in dem Ordner vorhanden sind, und dort Inhalt in C: \ 1 \ all einfügen.txt

2

Wie wäre es mit diesem Ansatz?

+0

Seit OP sagt die Dateien sind im selben Verzeichnis, müssen Sie möglicherweise '-maxdepth 1' zum' find' Befehl hinzufügen. – codeforester

+0

Funktioniert gut mit einer großen Anzahl von Dateien, bei denen der Ansatz der akzeptierten Antwort fehlschlägt – amine

Verwandte Themen