GNU/Linux >> Tutoriales Linux >  >> Ubuntu

¿Eliminar el directorio principal (no vacío) si un directorio secundario específico está vacío?

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:

  1. enumera las carpetas dentro de un directorio
  2. 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

  1. Copie el script en un archivo vacío, guárdelo como delete_empty.py
  2. 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

  1. Copie el script en un archivo vacío, guárdelo como delete_empty.py
  2. 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.


Ubuntu
  1. ¿'rm .*' alguna vez elimina el directorio principal?

  2. ¿Cómo eliminar todos los archivos excepto un archivo con nombre de una carpeta específica?

  3. ¿Cómo mover el directorio de datos Mysql?

  4. ¿Mover solo los últimos 8 archivos de un directorio a otro directorio?

  5. ¿Predeterminar nuevos archivos y carpetas secundarios a la propiedad de la carpeta principal?

Cómo obtener el tamaño de un directorio en Linux

El comando pwd de Linux

Cómo eliminar un directorio en Ubuntu 20.04

Eliminar directorio en Linux:cómo eliminar una carpeta desde la línea de comandos

Cómo eliminar archivos y directorios usando la terminal en Debian 10

¿Cómo puedo eliminar recursivamente directorios vacíos en mi directorio de inicio?