Bereiche
News
Rewind
Tipps & Berichte
Forum
Galerie
Journals
Events
Umfragen
Themenwoche
Kleinanzeigen
Interaktiv
Anmelden
Registrierung
Zu allen empfangenen Nachrichten
Suche...
Zur erweiterten Suche
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?
ruggiero
25.02.09
10: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
Hilfreich?
0
Kommentare
ibd
26.02.09
19:31
Mach ein Pythonskript. Schau mal sys.walk() an...
Hilfreich?
0
Mr. Krabs
02.03.09
14: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!“
Hilfreich?
0
gibtsNicht
02.03.09
14: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
Hilfreich?
0
ApfelTux
06.03.09
12: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... !
Hilfreich?
0
ruggiero
06.03.09
20: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!
Hilfreich?
0
ApfelTux
07.03.09
14: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ß
Hilfreich?
0
Rantanplan
07.03.09
16: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“
Hilfreich?
0
Rantanplan
07.03.09
16:10
Ups, das Bild sieht ja schauderlich aus
War ein gestochen scharfes PNG ...
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
Hilfreich?
0
Rantanplan
07.03.09
16: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“
Hilfreich?
0
Rantanplan
07.03.09
16:16
GRRRRRRRR, nix mit korrekt formatiert
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
Hilfreich?
0
ApfelTux
18.03.09
15: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?
Hilfreich?
0
ruggiero
27.03.09
10: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
Hilfreich?
0
Kommentieren
Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.