¿Cómo puedo eliminar recursivamente todos los archivos y directorios vacíos en Linux?

¿Cómo puedo eliminar recursivamente todos los archivos y directorios vacíos en Linux?

¿Cómo puedo limpiar recursivamente todos los archivos y directorios vacíos en un directorio principal?

Digamos que tengo esta estructura de directorios:

Parent/
  |____Child1/
        |______ file11.txt (empty)
        |______ Dir1/ (empty)

  |____Child2/
        |_______ file21.txt
        |_______ file22.txt (empty)

  |____ file1.txt

Debería terminar con esto:

Parent/
  |____Child2/
        |_______ file21.txt

  |____ file1.txt

Respuesta1

Esta es una frase realmente simple:

find Parent -empty -delete

Se explica por sí mismo. Aunque cuando lo verifiqué me sorprendió que eliminara con éxito Parent/Child1. Por lo general, esperaría que procese al padre antes que al hijo, a menos que lo especifique -depth.

Esto funciona porque -deleteimplica -depth. Ver elGNU buscar manual:

-deleteBorrar archivos; Es cierto si la eliminación se realizó correctamente. Si la eliminación falla, se emite un mensaje de error. Si -delete falla, el estado de salida de find será distinto de cero (cuando finalmente salga). El uso de -delete activa automáticamente la opción -profundidad.


Tenga en cuenta que estas características no son parte delEstándar Posix, pero lo más probable es que esté presente en muchas distribuciones de Linux. Es posible que tengas un problema específico con los más pequeños como Alpine Linux ya que se basan encaja ocupadaque no soporta -empty.

Otros sistemas que sí incluyen no estándar -emptye -deleteincluyenBSDyOSXpero aparentemente noAIX.

Respuesta2

Aquí hay una solución de dos comandos.

Eliminar archivos vacíos

find Parent/ -type f -size 0 -delete

Intenta eliminartododirectorios

find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null

NB rmdirno puede eliminar directorios que no estén vacíos, por lo que es seguro ejecutarlo, pero producirá errores, que estamos ocultando.

Como arriba, pero siendo un poco más específico acerca de los mensajes de error que se ignoran. Es posible que sea necesario modificarlo si el mensaje varía según la distribución.

find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
  | grep -iv "Directory not empty$"

Respuesta3

También puedes hacer esto con la fdherramienta:

fd -t e -x rm -r

https://github.com/sharkdp/fd

información relacionada