Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Skript-Problem: Wie Verzeichnisbaum parsen?

Skript-Problem: Wie Verzeichnisbaum parsen?

ruggiero25.02.0910:43
Hallo,

ich möchte in einem Skript einen großen Verzeichnisbaum parsen, dazu muss ich aus dem Baum eine Liste mit den Pfaden zu allen "tiefsten" Verzeichnissen erstellen. D.h. ich brauchen einen Befehl, der in den Baum einsteigt und in das erste Unterverzeichnis geht, dort wieder das nächste Unterverzeichnis usw. bis kein Unterverzeichnis mehr kommt und dann den vollständigen Pfad zum letzten Unterverzeichnis ausgibt.
Dann geht es ein Verzeichnis hoch und in das nächste Unterverzeichnis rein, dort dann das gleiche Spiel.

Dabei kann ich vorher nicht wissen, wie tief jeder Teilbaum ist.

Zur Veranschaulichung:

Dieser Baum:

root
---Dir1
--- ---Subdir1ofDir1
--- --- ---DirA
--- --- --- ---File1
--- --- --- ---File2
--- --- --- ---File3
--- --- ---DirB
--- --- --- ---File1
--- --- --- ---File2
--- --- --- ---File3
--- ---Subdir2ofDir1
--- --- ---DirC
--- --- --- ---File1
--- --- --- ---File2
--- --- --- ---File3
--- ---Subdir3ofDir1
--- --- ---DirD
--- --- --- ---File1
--- --- --- ---File2
--- --- --- ---File3
--- --- ---DirE
--- --- --- ---File1
--- --- --- ---File2
--- --- --- ---File3
---Dir2
--- ---Subdir1ofDir2
--- --- ---DirF
--- --- --- ---File1
--- --- --- ---File2
--- --- --- ---File3
--- --- ---DirG
--- --- --- ---File1
--- --- --- ---File2
--- --- --- ---File3
--- ---Subdir2ofDir2
--- --- ---DirH
--- --- --- ---File1
--- --- --- ---File2
--- --- --- ---File3
--- --- ---DirI
--- --- --- ---File1
--- --- --- ---File2
--- --- --- ---File3

soll aufgelöst werden in diese Liste:

/Dir1/Subdir1ofDir1/DirA
/Dir1/Subdir1ofDir1/DirB
/Dir1/Subdir2ofDir1/DirC
/Dir1/Subdir3ofDir1/DirD
/Dir1/Subdir3ofDir1/DirE
/Dir2/Subdir1ofDir2/DirF
/Dir2/Subdir1ofDir2/DirG
/Dir2/Subdir2ofDir2/DirH
/Dir2/Subdir2ofDir2/DirI

der "find"-Befehl gibt mir immer auch alle "Zwischenverzeichnisse" aus, die Liste sieht dann so aus:

find <root> -type d

/
/Dir1
/Dir1/Subdir1ofDir1
/Dir1/Subdir1ofDir1/DirA
/Dir1/Subdir1ofDir1/DirB
/Dir1/Subdir2ofDir1
/Dir1/Subdir2ofDir1/DirC
/Dir1/Subdir3ofDir1
/Dir1/Subdir3ofDir1/DirD
/Dir1/Subdir3ofDir1/DirE
/Dir2
/Dir2/Subdir1ofDir2
/Dir2/Subdir1ofDir2/DirF
/Dir2/Subdir1ofDir2/DirG
/Dir2/Subdir2ofDir2
/Dir2/Subdir2ofDir2/DirH
/Dir2/Subdir2ofDir2/DirI

Kann mir da jemand helfen?

Vielen Dank!

Schönen Gruss,

Stephan
0

Kommentare

ibd
ibd26.02.0919:31
Mach ein Pythonskript. Schau mal sys.walk() an...
0
Mr. Krabs
Mr. Krabs02.03.0914:10
ruggiero:
Das was du brauchst ist eine Funktion, die dir alle Elemente eines Ordners anzeigt. Diese rufst du dann immer wieder auf, falls es sich bei einem Element um einen Ordner handelt. Was du brauchst ist also eine rekursive Funktion. Dann brauchst du auch nicht zu wissen, wie tief der Spaß geht, bzw dann kann es dir egal sein
„Deux Strudel!“
0
gibtsNicht02.03.0914:40
Kannst Du Dich darauf verlassen, dass in den Ordnern immer Dateien drin sind? Dann würde ich find auf die loslassen und alles nach dem letzten "/" gleich wieder rauslöschen

Also mit "find -type f" alle Dateien finden, mittels sed das Ende abschneiden und dann noch schauen, ob der aktuelle Verzeichnisname gleich ist wie der vorherige (wenn mehrere Dateien in einem Ordner) und in dem Fall diesen ignorieren
0
ApfelTux06.03.0912:12
hallo,
ist das Thema noch aktuell??

Ich hab da noch ein Shell-Script rumliegen, welches u.a. genau das macht... du müsstest es nurnoch an deine Bedürfnisse anpassen, da mein Script ab einem vorgegebenen Stammverzeichnis bis runter in alls SupDir's alle Dateien nach einem vorgegebenen Suchstring durchsucht...

Hab's noch nich auf MacOS ausgeführt. Aber so zur Historie:
Unter Windows geschrieben (Cygwin) und schon erfolgreich unter Windows, AIX-Unix, Linux getestet.
Daher stehn die Chancen für MacOS X nicht übel..

Also gib nen Funk... !
0
ruggiero06.03.0920:19
Hi,

ja, ist noch aktuell, ich probiere gerade mehrere Möglichkeiten aus, werde dann mal berichten, was am besten funktioniert hat.
Würde mich also über das Skript freuen!

Vielen Dank!
0
ApfelTux07.03.0914:47
Hoi,
ich schick's dir am Montag...
Hab's im Geschäft...

mal auf die schnelle gefragt:
gibts hier sowas wie PN-Messages oder die möglichkeit jemand ne Mail zu schicken... ?

Sonst müsst ich's hier rein posten...

Gruß
0
Rantanplan
Rantanplan07.03.0916:08
Vielleicht habe ich es falsch verstanden, aber wenn ich die Frage richtig verstanden habe, ist es doch sehr simpel? Ich habs einfach runtergetippt ohne nachzudenken ...

„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Rantanplan
Rantanplan07.03.0916:10
Ups, das Bild sieht ja schauderlich aus War ein gestochen scharfes PNG ...
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Rantanplan
Rantanplan07.03.0916:15
Ah, gerade entdeckt, man kann ja inzwischen auch Sourcecode richtig formatiert posten Also, dann nochmal:

#!/bin/bash

function deepdirlist ()
{
    local dir=0
    for f in *; do
        [ -d "$f" ] && dir=1 && cd "$f" && deepdirlist && cd ".."
    done
    [ $dir -ne 0 ] || pwd
}

deepdirlist
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Rantanplan
Rantanplan07.03.0916:16
GRRRRRRRR, nix mit korrekt formatiert
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
ApfelTux18.03.0915:19
Lag jetzt 2 Wochen krank im Bett und konnte daher mein Script nicht schicken...
Ich bin schon ne weile ausm shell-scripting draussen... aber Rantanplan's Schnipsel sollte doch funktionieren!

Ist das Thema jetzt erledigt? Oder brauchst du das Script noch?
0
ruggiero27.03.0910:12
Hallo zusammen,

ich habe jetzt mal einige Lösungen getestet:

Diese Lösung hier funktioniert nur, wenn innerhalb des Baumes keine Dateien liegen (also Dateien nur in den tiefsten Verzeichnissen liegen).

find . -type f -exec dirname {} ';' | sort -u


Das hier ist auch ein möglicher Weg:

#!/bin/bash

IFS=$'\n'

function dive_into_subdir {
    count=$(find "$1" -type d -mindepth 1| wc -l)
    if [ "$count" -eq 0 ]
    then
        echo $1
    else
        for dir in $(find "$1" -type d -mindepth 1)
        do
            dive_into_subdir "$dir"
        done
    fi
}

dive_into_subdir "$1"
das Ergebnis sollte dann noch nach "sort -u" geschickt werden.


Die Lösung von Rantanplan funktioniert ebenfalls wunderbar.


Vielen dank für Eure Hilfe!!

Schönen Gruss,

Stephan
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.