Ich muss alle Verzeichnisse behalten, die Dateien in einem bestimmten Unterverzeichnis enthalten, aber um alle Verzeichnisse zu löschen, in denen das Unterverzeichnis leer ist.
Genauer gesagt hier die Struktur:
A||--------312311| || |----Aufnahme| |----a.txt| |----b.txt|||--------453453| |----Aufnahme| || |-------a.mp3| |----a.txt| |----b.txt|||--------566532| |----Aufnahme| |----a.txt| |----b.txt
Die Unterverzeichnisse können eine Datei enthalten oder nicht. Also muss ich das gesamte Verzeichnis wie „312311“ und „566532“ löschen, und nur „453453“ sollte mit allen Daten darin verbleiben, da es eine Datei im Ordner „Recording“ gibt, was ein spezielles Verzeichnis für mich ist.
Ich habe viele Beiträge gesehen, aber es enthält Links zu vielen bestimmten Dateinamen. Jede Hilfe wird sehr geschätzt, da ich viele Male in einer Woche tun muss.
Akzeptierte Antwort:
Das folgende Skript wird genau das tun, was Sie beschreiben, es:
- listet die Ordner innerhalb eines Verzeichnisses auf
-
Sucht in jedem der Ordner nach einem Ordner mit dem Namen „Aufnahme“
- Wenn es existiert und leer ist, löscht es seinen übergeordneten Ordner
- falls doch nicht existieren, löscht es auch seinen übergeordneten Ordner
- Dateien auf der ersten Ebene innerhalb von A werden nicht gelöscht.
In einem Bild:
A||--------123456| || |----Aufnahme| |----a.txt| |----b.txt|||--------635623| |----Aufnahme| || |-------a.mp3| |----a.txt| |----b.txt|||--------123456| |----Aufnahme| |----a.txt| |----b.txt||--------Monkey.txt
ergibt:
A|||--------635623| |----Aufnahme| || |-------a.mp3| |----a.txt| |----b.txt|||--------Monkey.txt
Das Skript
#!/usr/bin/env python3import osimport sysimport shutdownildr =sys.argv[1]def path(*args):gebe os.path.join(*args)für d in os.listdir(dr ):try:wenn nicht os.listdir(path(dr, d, "Recording")):shutdown.rmtree(path(dr,d)) außer FileNotFoundError:shutdown.rmtree(path(dr,d)) außer NotADirectoryError:passieren
Zu verwenden
- Kopieren Sie das Skript in eine leere Datei und speichern Sie es als
delete_empty.py
-
Führen Sie es mit dem (vollständigen!) Verzeichnis (enthält Ihre Unterverzeichnisse, A in Ihrem Beispiel) als Argument durch den Befehl:
auspython3 /path/to/delete_empty.py /path/to/directory
Das ist es.
Erklärung
Den Inhalt Ihres Ordners „A“ in das Skript einspeisen,
os.listdir(dr)
listet seine Unterverzeichnisse (und Dateien) auf. Dann:
wenn nicht os.listdir(path(dr, d, "Recording"))
versucht, den Inhalt jedes (Unter-)Ordners aufzulisten, was einen Fehler auslöst, wenn es sich bei dem Element um eine Datei handelt:
außer NotADirectoryError pass
oder falls der Ordner „Aufnahme“ gar nicht existiert:
FileNotFoundError shutdown.rmtree(path(dr,d))
Wenn der Ordner „Aufnahme“ existiert und leer ist, wird der übergeordnete Ordner entfernt:
wenn nicht os.listdir(path(dr, d, "Recording")):shutdown.rmtree(path(dr,d))
BEARBEITEN
Zusätzlich, wie in den Kommentaren gefordert, eine Version, die nach mehreren Unterverzeichnissen (Namen) sucht.
Falls das Verzeichnis beliebige enthält von den aufgelisteten (nicht leeren) Unterverzeichnissen wird das Verzeichnis beibehalten. Andernfalls wird es gelöscht.
Zu verwenden
- Kopieren Sie das Skript in eine leere Datei und speichern Sie es als
delete_empty.py
-
Führen Sie es mit dem (vollständigen!) Verzeichnis (das Ihre Unterverzeichnisse enthält, A in Ihrem Beispiel) und den Namen der Unterverzeichnisse als Argumente durch den Befehl:
auspython3 /path/to/delete_empty.py /path/to/directory
Das ist es.
Verwandte:Was macht „sudo echo nameserver 8.8.8.8> /etc/resolv.conf“?Das Skript
#!/usr/bin/env python3import shutdownilimport osimport sysdr =sys.argv[1]; matchs =sys.argv[2:]def path(*args):gebe os.path.join(*args)for d in os.listdir(dr) zurück:# Verzeichnis löschen *es sei denn* eines der aufgelisteten Unterverzeichnisse hat Dateien keep =False # für jedes der aufgelisteten Unterverzeichnisse (Namen) auf Namen in Übereinstimmungen prüfen:try:if os.listdir(path(dr, d, name)):keep =True break except NotADirectoryError:# if the item not a dir, keine Verwendung für andere Namen zum Prüfen keep =True break außer FileNotFoundError:# wenn der Name (subdir) nicht existiert, beim nächsten Durchlauf prüfen if not keep:# wenn es keinen Grund zum Beibehalten gibt --> Shutil löschen. rmtree(path(dr,d))
Hinweis
Bitte führen Sie zuerst ein Testverzeichnis aus, um sicherzustellen, dass es genau das tut, was Sie wollen.