Rekursiv 'head -n 1' anwenden

M

mahed

Aktives Mitglied
Thread Starter
Dabei seit
26.03.2006
Beiträge
411
Reaktionspunkte
1
Hallo zusammen
Die Frage betrifft genau genommen etwas, dass auf einem Linuxserver stattfindet, deshalb auch die Baumansicht mit 'tree', aber die Shell ist auch Bash, wie bei Mac OS, deshalb hoffe ich, man kann mir hier helfen.
Ich habe eine Verzeichnisstruktur, die so aussieht:
Code:
[sunray]mzh @ ~/1lbs/week_040 $ tree reac*
react12
|-- cutoff15
|   |-- gnorm0.5
|   |   |-- 1-wt-opt.arc
|   |   |-- 1-wt-opt.mop
|   |   `-- 1-wt-opt.out
|   |-- gnorm1.0
|   |   `-- 1-wt-opt.mop
|   `-- gnorm5.0
|       `-- 1-wt-opt.mop
`-- cutoff9
    |-- gnorm0.5
    |   |-- 1-wt-opt.mop
    |   `-- 1-wt-opt.out
    |-- gnorm1.0
    |   `-- 1-wt-opt.mop
    `-- gnorm5.0
        `-- 1-wt-opt.mop

Wie kann ich rekursiv auf allen '.mop' Files head -n 1 aufrufen?

Vielen Dank für Hinweise.

EDIT:
Ich hab jetzt eine Lösung zusammen geklippt:
Code:
for i in reac*; do for j in cutoff*; do for k in gnorm*; do head -n 1 $i/$j/$k/*mop; echo; done; echo; done; echo; done
.
Bin immer offen für bessere Vorschläge.
 
Zuletzt bearbeitet:
find . -type f -name "*.mop" -exec head -n 1 {} \;
 
Oder:

find . -name '*.mop' -print0|xargs -0 head -n1

Dabei bin ich davon ausgegangen, das es nur Dateien mit .mop am Ende gibt. Wenn es auch Verzeichnisse gibt, dann beim find einfach noch ein -type f einfügen, wie olivetti es getan hat.
 
Zuletzt bearbeitet:
Besser + nehmen!

Meist ist's besser, statt
\;
ein
+
zu verwenden. Grund: Bei \; ruft find den angegebenen Befehl (hier: head) für jede Datei EINZELN auf. Setzt man aber +, so wird der Befehl so selten aufgerufen, wie möglich, da ihm so viele Dateinamen als Parameter übergeben werden, wie möglich.

Konkret: Bei \; würde aufgerufen:

head -n 1 react12/cutoff15/gnorm0.5/1-wt-opt.mop
head -n 1 react12/cutoff15/gnorm1.0/1-wt-opt.mop
[...]

Bei + würde aufgerufen:

head -n 1 react12/cutoff15/gnorm0.5/1-wt-opt.mop react12/cutoff15/gnorm1.0/1-wt-opt.mop [...]

Das macht häufig einen fühlbaren Geschwindigkeitsunterschied aus (wenn auch im konkreten Fall hier sicherlich nicht…).

Code:
find . -type f -name "*.mop" -exec head -n 1 {} +

Alexander
 
  • Gefällt mir
Reaktionen: promille
Dabei bin ich davon ausgegangen, das es nur Dateien mit .mop am Ende gibt. Wenn es auch Verzeichnisse gibt, dann beim find einfach noch ein -type f einfügen, wie olivetti es getan hat.
Bei der Z Shell würde es genügen, an das Dateimuster folgendes anzuhängen
(.)

Irgendwie finde ich das eleganter ;).
 
Zurück
Oben Unten