mac: Verketten Sie den Inhalt von Textdateien in vielen Verzeichnissen. Ordnen Sie Verzeichnisnamen an den Inhalt der entsprechenden Textdatei an

487
goober grape

In der folgenden Verzeichnisstruktur:

directory1
-subdirectoryA
--- fileA.txt
-subdirectoryB
--- fileB.txt-
UnterverzeichnisC
--- fileC.txt

Ich möchte eine Textdatei erzeugen, die den folgenden Text verkettet enthält:

Name des UnterverzeichnissesA-
Text in fileA.txt enthalten
Name des Unterverzeichnisses
B-Text in fileB.txt enthalten
Name des UnterverzeichnissesC-
Text in FileC.txt enthalten

Ich konnte die folgenden Befehle verwenden, um den Inhalt der Textdateien zu verketten, aber Informationen Ich benötige den Verzeichnisnamen, um die Ausgabe zu organisieren:

find ./prefix_common_to_all_target_directories* -name "*.txt" -exec cat '{}' \; > concatenated_extracted_info.txt 
1

1 Antwort auf die Frage

1
confetti
#!/bin/bash while read mydir; do echo "$:" >> output.txt cat $mydir/*.txt >> output.txt done < <(find test* -type d ) 

Dies durchläuft alle Verzeichnisse innerhalb directory1und macht genau das, was Sie wollen. Bitte beachten Sie, dass Sie dieses Skript innerhalb von ausführen müssen directory1.


Einige Erklärungen:

Zunächst find test* -type dläuft die pro Zeile jedes Unterverzeichnis Namen druckt. Diese Ausgabe wird dann für die read mydirAusführung aller Elemente innerhalb der whileSchleife einmal für jede Zeile eingespeist ( $mydirwird jeder Zeile zugewiesen (alias Name des Unterverzeichnisses)).
Dann wird die erste Zeile in der Schleife schreibt den Verzeichnisnamen mit einem Doppelpunkt in output.txt, mit >>was bedeutet, „anhängen zu einer Datei“ (wenn die Datei nicht existiert, wird sie erstellt).
Die zweite Zeile innerhalb der Schleife schreibt den Inhalt jeder *.txtDatei innerhalb des Unterverzeichnisses output.txtin "Append-Modus".


Mein Test-Setup (mit dem obigen Skript als createfile.sh):

$ ls * test1: fileA.txt  test2: fileB.txt  test3: fileC.txt $ bash createfile.sh $ cat output.txt  test1: file content from dir1 test2: test content from dir2 test3: test content from dir3 
Danke dir! das hat perfekt funktioniert! Jetzt werde ich herausfinden warum;) goober grape vor 5 Jahren 0
@goobergrape Ich habe eine Erklärung hinzugefügt und den Code vereinfacht. Wenn meine Antwort Ihnen weiterhelfen würde, wäre ich Ihnen dankbar (das "✓" auf der linken Seite). :) confetti vor 5 Jahren 0
Wow, das ist unglaublich hilfreich und geschätzt! Vielen Dank für die Erklärung. Ich habe das akzeptiert, danke auch dafür, dass Sie mich darauf aufmerksam gemacht haben. Prost! goober grape vor 5 Jahren 1