Wie verkette ich Dateien aus verschiedenen Unterverzeichnissen?

Wie verkette ich Dateien aus verschiedenen Unterverzeichnissen?

Ich habe einen großen Ordner mit vielen Unterverzeichnissen, die jeweils viele .txtDateien enthalten. Ich möchte alle diese Dateien zu einer .txtDatei 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'- fDateien in /path/to/sourceUnterverzeichnissen 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 globstarFunktion erreichen:

$ shopt -s globstar
$ cat **/*.txt > merged.txt

Ein allgemeinerer, wenn auch weniger eleganter Ansatz besteht darin, findals Treiber zu verwenden und ihn catjede Datei aufrufen zu lassen und die Ausgabe anzuhängen:

$ find -name \*.txt -exec sh -c 'cat {} >> merged.out' \;

Der Aufruf shist 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 finddass 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 findBefehl

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 dotglobum sie wieder hinzuzufügen).

verwandte Informationen