Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

mit bash einen Verzeichnisbaum rekursiv durchlaufen und in letzten blatt einen Befehl ausfuehren

15 views
Skip to first unread message

Astrid

unread,
Nov 22, 2023, 12:37:16 PM11/22/23
to
Hallo!

Ich habe einen Verzeichnisbaum, als Beispiel, der kann aber immer
anders aussehen in Tiefe, Verschachtelung, dirname

- dir1
--subdir11
---subdir111
----0
----10
----17
--subdir12
---5
---10
---18
---20
--subdir13
---11
---22
- dir2
--subdir21
---6
---8
---11
---17
---20
- dir3
--subdir31
---4
---6
--subdir32
---subdir321
----5
----6
----9
----111
--subdir33
---7
---18
----20
-dir4
--11
--17
--23

Ich habe meine Herabsteigetiefe erreicht, wenn das Verzeichnis,
wo ich gerade stehe, nur noch Unterverzeichnisse enthaelt, deren
Verzeichnisnamen sich nur aus Ziffern zusamensetzen, also
Integerzahlen sind.

Dann fuehre ich in dem dazugehoerigen Obervereichnis den Befehlt
"tuwas" aus.

In obigem Beispiel soll der Befehl tuwas ausgefuehrt werden in
subdir111, subdir12, subdir13, subdir21, subdir31, subdir321, subdir33 und
dir4.

Kann man das in bash irgendwie elegant mit wenigen Befehlen hinkriegen?
Das Durchlaufen mit find vielleicht, aber wie dann dieses "Endekriterium",
dass es da in der Verschachtelung enden soll, wenn es nur noch Zahlenunterverzeichnisse gibt und dann den Befehl ausfuehren und dann den
naechsten Verschachtelungspfad verfolgen.

Danke.

Gruss, Astrid

Stefan Wiens

unread,
Nov 22, 2023, 2:17:43 PM11/22/23
to
Also mit find(1) würde ich ungefähr so vorgehen:

Alle Verzeichnisse, deren Name mindestens ein Zeichen
außer [0-9] enthält:

find $dir -type d -name "*[^0-9]*"

Das koppeln mit allen Unterverzeichnissen, deren Namen
ausschließlich Ziffern enthält:

find $subdir -type d "!" -name "*[^0-9]*"

was natürlich negiert werden muss.

Ob das innerhalb find geht oder besser mit test,
probiere ich vielleicht später.

--
Stefan

Christian Garbs

unread,
Nov 22, 2023, 4:22:58 PM11/22/23
to
Mahlzeit!
Das sind bestimmt GNU-Erweiterungen, aber mit find(1) findest Du so
die relevanten Verzeichnisse:

$ mkdir -p /tmp/X/dir1/subdir11/subdir11/{0,10,17} /tmp/X/dir2/{5,10,18,20}
$ find /tmp/X -type d -regextype posix-extended -regex '.*/[0-9]+'
/tmp/X/dir2/20
/tmp/X/dir2/18
/tmp/X/dir2/10
/tmp/X/dir2/5
/tmp/X/dir1/subdir11/subdir11/17
/tmp/X/dir1/subdir11/subdir11/10
/tmp/X/dir1/subdir11/subdir11/0

Wie Du das dann daraus am besten weiter verarbeitest, musst Du gucken,
vielleicht passen '-exec tuwas {} +' oder '-execdir tuwas {} ;', je
nachdem, wie tuwas genau funktioniert.

Gruß
Christian
--
....Christian.Garbs....................................https://www.cgarbs.de
DAS NEBELHORN
Je Atue
desto tatue

Astrid

unread,
Nov 23, 2023, 12:45:22 AM11/23/23
to
Hallo Christian,

danke Dir, aber ich moechte ja nicht die Zifferndirectories finden, sondern den parent der
Zifferndirectories.
Also in Deinem Beispiel moechte ich dann finden:

/tmp/X/dir2
/tmp/X/dir1/subdir11/subdir11/

Gruss, Astrid

Astrid

unread,
Nov 23, 2023, 12:57:07 AM11/23/23
to
Hallo Stefan,

danke Dir.

> find $dir -type d -name "*[^0-9]*"
Das ist schon supi, aber da moechte ich dann nicht alle directories finden,
sondern nur das letzte in dem jeweiligen Ast.

Also ich moechte in meinem Beispiel NICHT finden:

/dir1
/dir1/subdir11
/dir1/subdir11/subdir111
/dir1/subdir12
/dir1/subdir13
/dir2
/dir2/subdir21
/dir3
/dir3/subdir31
/dir3/subdir32
/dir3/subdir32/subdir321
/dir3/subdir33
/dir4

die Dein erstes find finden wuerde, sondern nur die, die letzten in einer
Kette, die dann nur noch Ziffernkinder haben.

Also ich moechte dann nur finden:

/dir1/subdir11/subdir111
/dir1/subdir12
/dir1/subdir13
/dir2/subdir21
/dir3/subdir31
/dir3/subdir32/subdir321
/dir3/subdir33
/dir4

Gruss, Astrid

Thomas Heuving

unread,
Nov 23, 2023, 3:30:04 AM11/23/23
to
Keine Ahnung, ob elegant:
for d in $(for dir in $(find . -wholename '*/[0-9]*' -print);
do dirname "$dir"; done | sort | uniq);
do
echo "$d";
done


Tschüß
--
Thomas Heuving

Astrid

unread,
Nov 24, 2023, 9:43:20 AM11/24/23
to
Hallo Thomas,

danke Dir.
Aber ich moechte ja nicht die Zahlenverzeichnisse finden,
sondern, wenn ein Verzeichnis Zahlenunterverzeichnisse
hat, dann den Namen des parent-Verzeichnisses mit
den Zahlenunterverzeichnissen.

Gruss, Astrid
0 new messages