Das folgende Skript funktioniert genau so, wie Sie es beschreiben:
- listet die Ordner in einem Verzeichnis auf
Sucht in jedem Ordner nach einem Ordner mit dem Namen "Aufnahme".
- Wenn es existiert und leer ist, löscht es seinen übergeordneten Ordner
- Wenn es nicht vorhanden ist, wird auch der übergeordnete Ordner gelöscht
- Dateien auf der ersten Ebene in A werden nicht gelöscht.
In einem Bild:
A
|
|--------123456
| |
| |----Recording
| |----a.txt
| |----b.txt
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------123456
| |----Recording
| |----a.txt
| |----b.txt
|
|--------Monkey.txt
wird darin enden, dass:
A
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------Monkey.txt
Das Skript
#!/usr/bin/env python3
import os
import sys
import shutil
dr = sys.argv[1]
def path(*args):
return os.path.join(*args)
for d in os.listdir(dr):
try:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
except FileNotFoundError:
shutil.rmtree(path(dr,d))
except NotADirectoryError:
pass
Benutzen
- Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter
delete_empty.py
Führen Sie es mit dem Verzeichnis (full!) (Enthält Ihre Unterverzeichnisse, A in Ihrem Beispiel) als Argument mit dem folgenden Befehl aus:
python3 /path/to/delete_empty.py /path/to/directory
Das ist es.
Erläuterung
Den Inhalt Ihres Ordners "A" in das Skript einspeisen,
os.listdir(dr)
listet seine Unterverzeichnisse (und Dateien) auf. Dann:
if not os.listdir(path(dr, d, "Recording"))
wird versuchen, den Inhalt jedes der (Unter-) Ordner aufzulisten, was einen Fehler auslöst, wenn das Element eine Datei ist:
except NotADirectoryError
pass
oder wenn der Ordner "Aufnahme" überhaupt nicht existiert:
FileNotFoundError
shutil.rmtree(path(dr,d))
Wenn der Ordner "Aufnahme" vorhanden und leer ist, wird der übergeordnete Ordner entfernt:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
BEARBEITEN
Zusätzlich, wie in Kommentaren angefordert, eine Version, die nach mehreren Unterverzeichnissen (Namen) sucht.
Im Fall enthält das Verzeichnis jede der aufgeführten (un- leer) subdirs, wird das Verzeichnis gehalten. Sonst wird es gelöscht.
Benutzen
- Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter
delete_empty.py
Führen Sie es mit dem Verzeichnis (full!) (Enthält Ihre Unterverzeichnisse, in Ihrem Beispiel A) und den Namen der Unterverzeichnisse als Argumente mit dem folgenden Befehl aus:
python3 /path/to/delete_empty.py /path/to/directory <subdir1> <subdir2> <subdir3>
Das ist es.
Das Skript
#!/usr/bin/env python3
import shutil
import os
import sys
dr = sys.argv[1]; matches = sys.argv[2:]
def path(*args):
return os.path.join(*args)
for d in os.listdir(dr):
# delete directory *unless* either one of the listed subdirs has files
keep = False
# check for each of the listed subdirs(names)
for name in matches:
try:
if os.listdir(path(dr, d, name)):
keep = True
break
except NotADirectoryError:
# if the item is not a dir, no use for other names to check
keep = True
break
except FileNotFoundError:
# if the name (subdir) does not exist, check for the next
pass
if not keep:
# if there is no reason to keep --> delete
shutil.rmtree(path(dr,d))
Hinweis
Bitte führen Sie zuerst ein Testverzeichnis aus, um sicherzustellen, dass es genau das tut, was Sie wollen.