ihkavu
Anmeldungsdatum: 6. März 2010
Beiträge: 172
|
Ich habe einen Ordner mit Ordner drin. Diese Ordner haben jeweils Textdateien (*.txt) drin (und paar andere nicht txt dateien). Die Namen dieser Textdateien sind in jedem Ordner gleich. Wenige Textdateinamen gibt es aber nicht in jedem Ordner.
Ich möchte nun in dem übergeordneten Ordner alle Textdateien mit den selben Namen aneinanderknüpfen, so dass sie den Inhalt aller Textdateien mit diesem Namen beinhalten. Gibt es da einen schnellen Weg mit der Shell oder muss ich da ein Programm schreiben?
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7656
|
Dateien aneinanderheften geht mit cat, also cat */dateiname.txt Vielleicht reicht das ja auch schon. Wenn du eine ganze Reihe von Dateien so wirklich erstellen willst, vielleicht so: | for textdatei in */*.txt
do
basedatei=$(basename "$textdatei")
[ -e "$basedatei" ] && continue # existierende Datei nicht überschreiben
cat */"$basedatei" > "$basedatei"
done
|
Wenn die Textdateien keinen Zeilenumbruch am Ende haben, können in dem cat-Ergebnis zwei Zeilen zu einer werden.
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 8616
Wohnort: Münster
|
ihkavu schrieb: […] Gibt es da einen schnellen Weg mit der Shell
Man kann das sicher mit einem Monster-Einzeilen-Befehl lösen. Da man diesen aber testen muss, ist das nicht unbedingt der schnellste Weg.
oder muss ich da ein Programm schreiben?
Ich würde es mit einem kleinen Shell-Skript unter Verwendung der üblichen GNU-Werkzeuge machen: find findet alle gewünschten Dateinamen, sort sortiert diese, uniq entfernt die Dubletten. Für jeden Dateinamen in dieser Liste selektiert man dann (z.B. wieder über find) alle Dateien in den Ordnern und fügt diese mit cat zusammen, das Ergebnis speichert man per Ausgabeumleitung in einer neuen Datei.
|
ihkavu
(Themenstarter)
Anmeldungsdatum: 6. März 2010
Beiträge: 172
|
Danke für die Antworten.
Ich habe das von frostschutz probiert. Scheint funktioniert zu haben, bisher keinen Fehler gefunden. Auch hatte ich keine neue Zeile am Ende und es hat trotzdem keine zwei Zeilen aneinander geschrieben.
Innerhalb 1 Sekunde hat es das für 400 Dateien gemacht. Per Hand hätte das Tage gedauert. Vielen vielen Dank
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
kB schrieb: ihkavu schrieb: […] Gibt es da einen schnellen Weg mit der Shell
Man kann das sicher mit einem Monster-Einzeilen-Befehl lösen.
Du meinst sowas? | find -type f -exec basename -z {} \; | sort -zu | xargs -r0 sh -c 'for b; do find -type f -name "$b" -exec cat {} + >"$b"; done' --
|
😛
Da man diesen aber testen muss, ist das nicht unbedingt der schnellste Weg.
5min inklusive Vorbereitung | $ mkdir a b c d
$ touch {a,c}/foo.txt {a..d}/bar.txt
|
oder muss ich da ein Programm schreiben?
Ich würde es mit einem kleinen Shell-Skript unter Verwendung der üblichen GNU-Werkzeuge machen:
Man kann auchsort -u nehmen.
Genau das macht der "Monster-Einzeiler". ☺
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 8616
Wohnort: Münster
|
rklm schrieb: (… einen Monster-EInzeiler und testete ihn mit:) 5min inklusive Vorbereitung | $ mkdir a b c d
$ touch {a,c}/foo.txt {a..d}/bar.txt
|
Sehr schön. Ich hätte für den Test allerdings etwas kreativere Datei- und Verzeichnisnamen gewählt, z.B.: Immer Ärger mit Umlauten (ÄÖÜ), "Leerzeichen" & anderen <Sonderzeichen>.txt Я Шарли Эбдо (Ya Sharli Ebdo).txt
Das wollte ich mir nicht antun.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
kB schrieb:
Sehr schön. Ich hätte für den Test allerdings etwas kreativere Datei- und Verzeichnisnamen gewählt, z.B.: Immer Ärger mit Umlauten (ÄÖÜ), "Leerzeichen" & anderen <Sonderzeichen>.txt Я Шарли Эбдо (Ya Sharli Ebdo).txt
Das wollte ich mir nicht antun.
Warum? Ist doch keine große Sache. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | $ mkdir a b c d
$ touch {a,c}/'Immer Ärger mit Umlauten (ÄÖÜ), "Leerzeichen" & anderen <Sonderzeichen>.txt' {a..d}/'Я Шарли Эбдо (Ya Sharli Ebdo).txt'
$ find
.
./a
./a/Immer Ärger mit Umlauten (ÄÖÜ), "Leerzeichen" & anderen <Sonderzeichen>.txt
./a/Я Шарли Эбдо (Ya Sharli Ebdo).txt
./b
./b/Я Шарли Эбдо (Ya Sharli Ebdo).txt
./c
./c/Immer Ärger mit Umlauten (ÄÖÜ), "Leerzeichen" & anderen <Sonderzeichen>.txt
./c/Я Шарли Эбдо (Ya Sharli Ebdo).txt
./d
./d/Я Шарли Эбдо (Ya Sharli Ebdo).txt
$ find -type f -exec basename -z {} \; | sort -zu | xargs -r0 sh -c 'for b; do find -type f -name "$b" -exec cat {} + >"$b"; done' --
$ ls -1
a/
b/
c/
d/
'Immer Ärger mit Umlauten (ÄÖÜ), "Leerzeichen" & anderen <Sonderzeichen>.txt'
'Я Шарли Эбдо (Ya Sharli Ebdo).txt'
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Es sollen auch Nicht-Textdateien in den Ordnern sein, daher spendiere ich
| touch a.pdf b.png c.svg d.cc e.java
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
user_unknown schrieb: Es sollen auch Nicht-Textdateien in den Ordnern sein, daher spendiere ich
| touch a.pdf b.png c.svg d.cc e.java
|
Gute Punkt! Beim Testen ist mir das Namenskriterium abhanden gekommen. | find -type f -name \*.txt -exec basename -z {} \; | sort -zu | xargs -r0 sh -c 'for b; do find -type f -name "$b" -exec cat {} + >"$b"; done' --
|
Danke!
|
ihkavu
(Themenstarter)
Anmeldungsdatum: 6. März 2010
Beiträge: 172
|
rklm schrieb: | find -type f -name \*.txt -exec basename -z {} \; | sort -zu | xargs -r0 sh -c 'for b; do find -type f -name "$b" -exec cat {} + >"$b"; done' --
|
Werde für die Ergebnisse der jetzt laufenden Berechnung testen. Dankeschön!
|