mehrere Aktionen auf ne grosse Ordnerstruktur anwenden, wie?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Hi!

Wir haben hier nen grossen zentralen Projektserver. Auf dem befindet sich fuer jedes Projekt (sprich fuer jeden Kinofilm) ein eigener Unterordner, in dem sich alle Daten dieses Projektes sammeln. Darin sind dann sehr viele Daten, weil alles mit Einzelbildsequenzen funktioniert. So ein Projektordner kann locker mal 1-2TB gross sein und 400.000-600.000 Dateien und Ordner beinhalten.

Am Ende eines Projektes muessen vor dem Wegarchivieren per Taperoboter einige Aufraeumarbeiten gemacht werden, damit nicht unnoetige Sachen archiviert werden. Das sind z.B. Lowres-Proxies der Highres-Bilddaten, das sind temporaere Ordner, das sind die ganzen Spezialdateien, die von Macs angelegt werden (._DS-Store, Ressourcefork-Dateien, usw.) und etliches mehr. All diese Dateien und Ordner muessen geloescht werden.

Bisher macht das ein Shellscript mehr schlecht als recht mit dem 'find'-Befehl.

Wie wuerde man denn das in Python vom Ansatz her schlau loesen, damit es performancemaessig ueberschaubar bleibt? Ich muss ja irgendwie ne Liste (oder mehrere?) mit allen Dateien und Ordnern machen und die dann auf bestimmte Kriterien abfragen.

Ist es da schlau, einfach erstmal rekursiv alle Dateien zu suchen und die dann mittels lauter 'if xy' einfach durchzugehen? Vermutlich nicht, oder? Denn wenn ich nen ganzen Ordner eh loeschen kann, muss ich ja dessen Inhalt nicht durchsuchen. Also erstmal ne Liste aller Ordner machen und die abarbeiten und dann in nem zweiten Durchgang alle noch verbleibenden Files?

Oder gibt es noch viel schlauere Ansaetze um mit so vielen Dateien und Ordner effizient umzugehen?

Danke fuer jegliche Ideen und Stupser in die richtige Denkrichtung.

Shakebox
BlackJack

Schau Dir mal `os.walk()` an. Und das `shutil`-Modul.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

jo, danke, das kenn ich. Auch das path-Modul waere da ja ganz hilfreich. Mir ging es eher so um den "grossen" Ansatz, nicht um die genauen Kommandos. Aber ich werd mich da mal durchwuehlen und einfach ausprobieren. Danke!
BlackJack

Na der "grosse" Ansatz ist: Mit `os.walk()` durch die Verzeichnisse und Dateien gehen. Erst die Verzeichnisse überprüfen und die Kandidaten die gelöscht werden sollen von der Platte (`shutil.rmtree()`) und aus der Liste entfernen, die `os.walk()` liefert. Und dann die Dateien bearbeiten.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

ah, das klingt schlau, stimmt. Ich hab auch dummerweise erstmal automatisch "os.path.walk" gelesen, was ja was anderes ist.

Das mit dem Rausloeschen der Liste ist natuerlich der clevere Ansatz. Ich, der leider Python-Denkweisen noch nicht verinnerlicht hat, denkt natuerlich erstmal wieder ich muss zwei Durchlaeufe machen, einmal erst die Verzeichnisse und wenn die auf der Platte alle weg sind such ich nochmal alles durch nach den Files. Aber wenn ich das Loeschen sowohl auf die Dateien als auch auf die Liste anwende, bleibt natuerlich einfach ne Liste uebrig mit den verbleibenden Files.

Sehr gut, da waere ich allein mal wieder nicht draufgekommen. Danke Dir und schoenes Wochenende!
lunar

Mit ein bisschen Meta-Magie: http://paste.pocoo.org/show/50833/

Ich würde das path.py-Modul nutzen, weil es alle Informationen über einen Pfad übersichtlich zusammenpackt, was das Hantieren mit Dateien angenehmer macht.

Ferner würde ich solche "match"-Funktionen bevorzugen, weil sie flexibler und leichter erweiterbar sind als endlose if-elif-else-Kaskaden.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

uff, danke auch Dir, aber ueber den Code muss ich glaub ein wenig nachdenken :)

klingt interessant, uebersteigt aber so auf Anhieb doch deutlich meine Verstaendnismoeglichkeit. Macht aber nix, ich hab jetzt ja dann ein Wochenende Zeit, darueber nachzudenken und das nachzuvollziehen.

Danke nochmal fuer den Vortrag gestern und auch Dir ein schoenes Wochenende!
lunar

http://paste.pocoo.org/show/50839/ <- Nochmal ausführlich kommentiert ;)

Das schöne Wochenende werde ich hoffentlich haben, ich wünsche mal Gleiches und gutes Gelingen ;)
Antworten