Il suffit de trouver des répertoires vides
Afin de ne trouver que les répertoires vides (comme spécifié dans le titre de la question), la réponse du mosg est correcte:
find -type d -empty
Mais -emptypeut ne pas être disponible sur des findversions très anciennes (c'est le cas de HP-UX par exemple). Si tel est votre cas, consultez les techniques décrites dans la section ci-dessous Un répertoire est-il vide? .
Supprimer les répertoires vides
C'est un peu délicat: supposons qu'un répertoire MyDircontienne des répertoires vides. Après avoir supprimé ces répertoires vides, MyDirdeviendra un répertoire vide et devrait également être supprimé. Par conséquent, j'utilise la commande rmdiravec l'option --parents(ou -p) qui supprime également les répertoires parents lorsque cela est possible:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
Sur les anciennes findversions, l'instruction +n'est pas encore prise en charge, vous pouvez donc utiliser à la ;place:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
Un répertoire est-il vide?
La plupart de ces réponses expliquent comment vérifier si un répertoire est vide. Par conséquent, je propose ici les trois techniques différentes que je connais:
[ $(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
une variante:
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
Explication:
find -pruneest similaire à l' find -maxdepth 0utilisation de moins de caractères
find -type d imprime uniquement les répertoires
find -empty imprime les répertoires et fichiers vides
> 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} ))
Cette astuce est à 100% bashmais invoque (génère) un sous-shell. L'idée est de Bruno De Fraine et améliorée par le commentaire de teambob . Je conseille celui-ci si vous utilisezfrapper et si votre script n'a pas besoin d'être portable.
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
Note: pas de différence entre un répertoire vide et un répertoire inexistant (et même lorsque le chemin fourni est un fichier).
[ $(ls -A your/dir) ]
Cette astuce est inspirée de l'article de nixCraft publié en 2007. Andrew Taylor a répondu en 2008 et gr8can8dian en 2011.
if [ "$(ls -A your/dir)" ]
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
ou la version bashisme en une ligne:
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
Remarque: ls retourne $?=2lorsque le répertoire n'existe pas. Mais aucune différence entre un fichier et un répertoire vide.