Solo encuentra directorios vacíos
Para encontrar directorios vacíos (como se especifica en el título de la pregunta), la respuesta de mosg es correcta:
find -type d -empty
Pero -empty
puede que no esté disponible en find
versiones muy antiguas (este es el caso de HP-UX, por ejemplo). Si este es su caso, consulte las técnicas descritas en la sección siguiente. ¿Hay un directorio vacío? .
Eliminar directorios vacíos
Esto es un poco complicado: suponga que un directorio MyDir
contiene directorios vacíos. Después de eliminar estos directorios vacíos, MyDir
se convertirá en un directorio vacío y también debe eliminarse. Por lo tanto, uso el comando rmdir
con la opción --parents
(o -p
) que también elimina los directorios principales cuando es posible:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
En la find
versión anterior , la declaración +
aún no es compatible, por lo tanto, puede usar ;
en su lugar:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
¿Está vacío un directorio?
La mayoría de estas respuestas explican cómo comprobar si un directorio está vacío. Por lo tanto, proporciono aquí las tres técnicas diferentes que conozco:
[ $(find your/dir -prune -empty) = your/dir ]
d=your/dir
if [ x$(find "$d" -prune -empty) = x"$d" ]
then
echo "empty (directory or file)"
else
echo "contains files (or does not exist)"
fi
una variacion:
d=your/dir
if [ x$(find "$d" -prune -empty -type d) = x"$d" ]
then
echo "empty directory"
else
echo "contains files (or does not exist or is not a directory)"
fi
Explicación:
find -prune
es similar a find -maxdepth 0
usar menos caracteres
find -type d
imprime directorios solamente
find -empty
imprime los directorios y archivos vacíos
> mkdir -v empty1 empty2 not_empty
mkdir: created directory 'empty1'
mkdir: created directory 'empty2'
mkdir: created directory 'not_empty'
> touch not_empty/file
> find empty1 empty2 not_empty -prune -empty
empty1
empty2
(( ${#files} ))
Este truco es 100% bash
pero invoca (genera) un sub-shell. La idea es de Bruno De Fraine y mejorada por el comentario de teambob . Te aconsejo este si usasintento y si su script no tiene que ser portátil.
files=$(shopt -s nullglob dotglob; echo your/dir/*)
if (( ${#files} ))
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
Nota: no hay diferencia entre un directorio vacío y uno que no existe (e incluso cuando la ruta proporcionada es un archivo).
[ $(ls -A your/dir) ]
Este truco está inspirado en el artículo de nixCraft publicado en 2007. Andrew Taylor respondió en 2008 y gr8can8dian en 2011.
if [ "$(ls -A your/dir)" ]
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
o la versión bashism de una línea:
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
Nota: ls
regresa $?=2
cuando el directorio no existe. Pero no hay diferencia entre un archivo y un directorio vacío.