El siguiente script hará exactamente lo que usted describe:
- enumera las carpetas dentro de un directorio
Busca dentro de cada una de las carpetas una carpeta llamada "Grabación"
- Si existe y está vacío, elimina su carpeta superior
- si no existe, también elimina su carpeta superior
- los archivos en el primer nivel dentro de A no se eliminarán.
En una imagen:
A
|
|--------123456
| |
| |----Recording
| |----a.txt
| |----b.txt
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------123456
| |----Recording
| |----a.txt
| |----b.txt
|
|--------Monkey.txt
resultará en:
A
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------Monkey.txt
La secuencia de comandos
#!/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
Usar
- Copie el script en un archivo vacío, guárdelo como
delete_empty.py
Ejecútelo con el directorio (completo) (que contiene sus subdirectorios, A en su ejemplo) como argumento mediante el comando:
python3 /path/to/delete_empty.py /path/to/directory
Eso es.
Explicación
Alimentando el contenido de su carpeta "A" al script,
os.listdir(dr)
enumerará sus subdirectorios (y archivos). Entonces:
if not os.listdir(path(dr, d, "Recording"))
intentará enumerar el contenido de cada una de las (sub) carpetas, lo que generará un error si el elemento es un archivo:
except NotADirectoryError
pass
o si la carpeta "Grabación" no existe en absoluto:
FileNotFoundError
shutil.rmtree(path(dr,d))
Si la carpeta "Grabación" existe y está vacía, se elimina la carpeta superior:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
EDITAR
Además, como se solicitó en los comentarios, una versión que verificará múltiples subdirecciones (nombres).
En caso de que el directorio contenga alguno de los subdirectorios enumerados (no vacíos), el directorio se conserva. De lo contrario, se eliminará.
Usar
- Copie el script en un archivo vacío, guárdelo como
delete_empty.py
Ejecútelo con el directorio (completo) (que contiene sus subdirecciones, A en su ejemplo) y los nombres de subdirecciones como argumentos mediante el comando:
python3 /path/to/delete_empty.py /path/to/directory <subdir1> <subdir2> <subdir3>
Eso es.
La secuencia de comandos
#!/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))
Nota
Primero ejecute en un directorio de prueba para asegurarse de que hace exactamente lo que desea.