Discussion:
mit bash einen Verzeichnisbaum rekursiv durchlaufen und in letzten blatt einen Befehl ausfuehren
(zu alt für eine Antwort)
Astrid
2023-11-22 17:37:13 UTC
Permalink
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
2023-11-22 19:17:40 UTC
Permalink
Post by Astrid
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.
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
Astrid
2023-11-23 05:57:05 UTC
Permalink
Hallo Stefan,

danke Dir.
Post by Stefan Wiens
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
Urs Janßen
2023-11-23 06:41:08 UTC
Permalink
Post by Astrid
/dir1/subdir11/subdir111
/dir1/subdir12
/dir1/subdir13
/dir2/subdir21
/dir3/subdir31
/dir3/subdir32/subdir321
/dir3/subdir33
/dir4
find . -type d -name '[0-9]*' -print0 | xargs -0rn 1 dirname | uniq

wenn die wildcard zu ungenau ist, halt vor dem dirname besser filtern
mittels "grep -E" o.ae.
Christian Garbs
2023-11-22 21:22:56 UTC
Permalink
Mahlzeit!
Post by Astrid
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.
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
2023-11-23 05:45:20 UTC
Permalink
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
Thomas Heuving
2023-11-23 08:10:48 UTC
Permalink
Post by Astrid
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
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
2023-11-24 14:43:19 UTC
Permalink
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

Loading...