¿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 -delete
implica -depth
. Ver elGNU buscar manual:
-delete
Borrar 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 -empty
e -delete
incluyenBSDyOSXpero 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 rmdir
no 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$"