Tengo que mantener todo el directorio que contiene archivos en un subdirectorio específico, pero eliminar todos los directorios en los que el subdirectorio está vacío.
Para ser más específicos aquí está la estructura:
A||--------312311| || |----Grabación| |----a.txt| |----b.txt|||--------453453| |----Grabación| || |-------a.mp3| |----a.txt| |----b.txt|||--------566532| |----Grabación| |----a.txt| |----b.txt
Los subdirectorios pueden o no contener un archivo. Así que necesito eliminar todo el directorio como '312311' y '566532' y solo '453453' debe quedar con todos los datos porque tiene un archivo en la carpeta 'Grabación' que es un directorio específico para mí.
Vi muchas publicaciones, pero se vincula a muchos nombres de archivos específicos. Cualquier ayuda será muy apreciada ya que necesito hacerlo muchas veces en una semana.
Respuesta aceptada:
La siguiente secuencia de comandos 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, borra su carpeta superior
- si lo hace no existe, también borra su carpeta superior
- archivos en el primer nivel dentro de A no se eliminará.
En una imagen:
A||--------123456| || |----Grabación| |----a.txt| |----b.txt|||--------635623| |----Grabación| || |-------a.mp3| |----a.txt| |----b.txt|||--------123456| |----Grabación| |----a.txt| |----b.txt||--------Mono.txt
dará como resultado:
A|||--------635623| |----Grabación| || |-------a.mp3| |----a.txt| |----b.txt|||--------Mono.txt
El guión
#!/usr/bin/env python3import osimport sysimport shutildr =sys.argv[1]def path(*args):return os.path.join(*args)for d in os.listdir(dr ):pruebe:si no os.listdir(ruta(dr, d, "Grabación")):shutil.rmtree(ruta(dr,d)) excepto FileNotFoundError:shutil.rmtree(ruta(dr,d)) excepto NotADirectoryError:pasar
Para 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 con el comando:
python3 /ruta/hacia/eliminar_vacío.py /ruta/hacia/directorio
Eso es todo.
Explicación
Alimentando el contenido de su carpeta "A" al script,
os.listdir(dr)
enumerará sus subdirectorios (y archivos). Entonces:
if not os.listdir(ruta(dr, d, "Grabación"))
intentará enumerar el contenido de cada una de las (sub)carpetas, lo que generará un error si el elemento es un archivo:
excepto NotADirectoryError pass
o si la carpeta "Grabación" no existe en absoluto:
FileNotFoundError shutil.rmtree(ruta(dr,d))
Si existe la carpeta “Grabación” y está vacío, se elimina la carpeta superior:
if not os.listdir(ruta(dr, d, "Grabación")):shutil.rmtree(ruta(dr,d))
EDITAR
Además, como se solicitó en los comentarios, una versión que buscará múltiples subdirectorios (nombres).
En caso de que el directorio contenga cualquiera de los subdirectorios enumerados (vacíos), se conserva el directorio. De lo contrario, se eliminará.
Para 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) y los nombres de los subdirectorios como argumentos mediante el comando:
python3 /ruta/a/delete_empty.py /ruta/a/directorio
Eso es todo.
Relacionado:¿Qué hace “sudo echo nameserver 8.8.8.8> /etc/resolv.conf”?El guión
#!/usr/bin/env python3import shutilimport osimport sysdr =sys.argv[1]; coincidencias =sys.argv[2:]def path(*args):return os.path.join(*args)for d in os.listdir(dr):# eliminar directorio *a menos que* alguno de los subdirectorios enumerados tenga archivos keep =False # verifique para cada uno de los subdirectorios enumerados (nombres) el nombre en las coincidencias:intente:if os.listdir (path (dr, d, name)):keep =True break excepto NotADirectoryError:# si el elemento no es un dir, no sirve para otros nombres para verificar keep =True break excepto FileNotFoundError:# si el nombre (subdirectorio) no existe, verifique el siguiente paso si no es keep:# si no hay motivo para mantener --> eliminar shutil. rmtree(ruta(dr,d))
Nota
Primero ejecute en un directorio de prueba para asegurarse de que hace exactamente lo que desea.