[bash] Dateien in Unterordnern auslesen

n006

Cadet 3rd Year
Registriert
Feb. 2009
Beiträge
63
Hallo,
ich habe nach längerem googeln zwar schon ein paar "Teile" zusammen, die Kombination allerdings will sich mir nicht ergeben, deswegen ...

[Problem]
Ich habe Unterordner in folgendem Stil:
<name>-100
<name>-200
<name>-300
...
<name>-n

In jedem dieser Unterordner liegt eine bestimmte Datei, nennen wir Sie der Einfachheit halber einmal foo.bar.
Nun nöchte ich eine neue Datei (nennen wir Sie "file") erzeugen in der, der Reihe nach (<name>-100, <name>-200, <name>-300) jeweils die x-te Zeile (hier beispielhaft "5") jener Dateien hinterlegt wird. Zeilenweise.

[Was ich bereits habe]
Die 5te Zeile der Datei "foobar" in "file" anzuhängen müsste wie folge gehen:
Code:
sed -n -e '5p' foo.bar >> file

Iterieren über mehrere Dateien aus einem Unterordner mit bestimmter Endung würde so lauten:
Code:
for file in ./unterordner/*.endung
do
 #do something
done

[Frage/Aufgabe]
Wie kann ich nun eine bestimmte Datei in verschiedenen Unterordnern auslesen?


Vielen Dank im Voraus!

Grüße,
n006
 
Zuletzt bearbeitet: (typos)
Folgenden Befehl in dem Ordner ausführen in dem die Unterordner sind:
Code:
find . -name "foo.bar" -exec sed -n -e '5p' {} >> file \;

Das geht natürlich auch mit Joker:
Code:
find . -name "*.bar" -exec sed -n -e '5p' {} >> file \;

foo.bar und file natürlich gegen die richtigen Namen tauschen.
 
Hi,
danke Dir, das Problem an
find . -name "foo.bar"
is das eben die logische Reihenfolge der Ordner nicht berücksichtigt wird, zudem ist, dadurch das sehr sehr viele Daten in den Unterordnern liegen, der find Befehl (wie eben getestet) ziemlich langsam. Die performance könnte man zwar durch ein -maxdepth erhöhen, das Problem mit der Reihenfolge bliebe aber dennoch.
 
Zuletzt bearbeitet: (typo)
Dann so als Script:

Code:
#!/bin/sh

for file in ./<name>-*/*.bar
do
    sed -n -e '5p' $file >> file
done

Das berücksichtigt die logische Reihenfolge. Zu der Performance kann ich nichts sagen, keine Ahnung wie schnell das ist.

Wenn die Datei immer den Selben Namen hat kann man *.bar gegen den richtigen Namen ersetzen. Das sollte auch nochmal schneller gehen.
 
Danke dir! Super!
Hätte dazu nur eine Frage, würde der Ordner "a-1000" nicht vor "a-200" betrachtet werden?
 
Ja vielen Dank!
Gäbe es denn nicht die möglichkeit die ordner zu zählen und dann irgendwie in dein script aufzunehmen, um das erste sternchen zu eliminieren?
 
wenn deine Datein alle "gleich" beginnen kannst du ja auch noch ein
find ... | sort -k... -n | xargs sed ... machen.
 
Hi Azdak,
ich verstehe "sort -k... -n" nicht so richtig. Ich habe mir grad die manpage von sort angeschaut, ich werde aber aus dem -k nicht so recht schlau...
Zudem heißt die Datei immer gleich, lediglich der Ordner indem Sie steht ist unterschiedlich, beginnend mit sagen wir "ordner-" mit einer darauffolgenden zahl (100, 200, 300,...).
 
Zuletzt bearbeitet:
Ich glaube Azdak meint es so und das sollte auch wie gewollt funktionieren:

Code:
find . -maxdepth 2 -name "*.bar" | sort -n -k 1.11 | xargs sed -sne '5p' >> file

Du muss bei sort -n -k 1.11 die 1.11 anpassen. Die 11 muss der stelle entsprechen an der vom Ergebnis von find die Nummer anfängt anhand der Sortiert werden soll.

Spuckt find z.B. das hier aus
Code:
./balablablub-200/foo.bar
./balablablub-1000/foo.bar
./balablablub-999/foo.bar
muss es sort -n -k 1.15 heißen weil die Zahl nach der sortiert werden soll bei Position 15 anfängt.
 
Zurück
Oben