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 -empty
peut ne pas être disponible sur des find
versions 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 MyDir
contienne des répertoires vides. Après avoir supprimé ces répertoires vides, MyDir
deviendra un répertoire vide et devrait également être supprimé. Par conséquent, j'utilise la commande rmdir
avec 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 find
versions, 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 -prune
est similaire à l' find -maxdepth 0
utilisation 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% bash
mais 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 $?=2
lorsque le répertoire n'existe pas. Mais aucune différence entre un fichier et un répertoire vide.