
Ich habe einen großen Ordner mit vielen Unterverzeichnissen, die jeweils viele .txt
Dateien enthalten. Ich möchte alle diese Dateien zu einer .txt
Datei zusammenfassen. Ich kann dies für jedes der Unterverzeichnisse mit tun cat *.txt>merged.txt
, aber ich versuche, dies für alle Dateien im großen Ordner zu tun. Wie mache ich das?
Antwort1
Versuche es mit
find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile
Suchen Sie rekursiv nach allen '*.txt'- f
Dateien in /path/to/source
Unterverzeichnissen und fügen Sie alle zu einer einzigen Datei zusammen mergedfile
.
Um die Dateien jedes Unterverzeichnisses innerhalb seines Verzeichnisses zu verketten, gehen Sie wie folgt vor:
find . -mindepth 1 -type d -execdir sh -c 'cat $1/*.txt >> $1/mergedfile' _ {} \;
Antwort2
Wenn Sie Bash verwenden und die Anzahl der Textdateien begrenzt ist (d. h. die maximale Argumentanzahlgrenze nicht überschreitet, die sehr groß, aber nicht unendlich ist), können Sie dies problemlos mit der folgenden globstar
Funktion erreichen:
$ shopt -s globstar
$ cat **/*.txt > merged.txt
Ein allgemeinerer, wenn auch weniger eleganter Ansatz besteht darin, find
als Treiber zu verwenden und ihn cat
jede Datei aufrufen zu lassen und die Ausgabe anzuhängen:
$ find -name \*.txt -exec sh -c 'cat {} >> merged.out' \;
Der Aufruf sh
ist hier erforderlich, da Sie das Ergebnis jedes anhängen möchten cat
. Stellen Sie sicher, dass die Ausgabedatei eine andere Erweiterung hat oder außerhalb des Baums liegt, den Sie zusammenführen, oder find
dass sie versucht, die Ausgabe mit sich selbst zu verketten.
Antwort3
Wenn Sie die Verkettung in einer bestimmten Reihenfolge durchführen müssen, werden die Dateien im Folgenden in lexikografischer Reihenfolge (sortiert nach Pfadnamen) wie folgt verkettet bash
:
shopt -s globstar
for name in **/*.txt; do
[ -f "$name" ] && cat <"$name"
done >merged.out
Dies ähnelt dem find
Befehl
find . -type f -name '*.txt' -exec cat {} ';' >merged.out
außer dass die Reihenfolge anders sein kann. Symbolische Links zu normalen Dateien würden eingeschlossen (fügen Sie ein hinzu, && [ ! -L "$name" ]
wenn Sie sie nicht möchten) und versteckte Dateien (und Dateien in versteckten Verzeichnissen) würden ausgeschlossen (verwenden Sie , shopt -s dotglob
um sie wieder hinzuzufügen).