Trouvez juste les répertoires vides
Afin de trouver uniquement les répertoires vides (comme spécifié dans le titre de la question), la fonction La réponse de Mosg est correct :
find -type d -empty
Mais -empty
peut ne pas être disponible sur les très anciennes find
(c'est le cas de HP-UX par exemple). Si c'est votre cas, voyez 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
contient des répertoires vides. Après avoir supprimé ces répertoires vides, MyDir
deviendra un répertoire vide et devra également être supprimé. J'utilise donc 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 plus anciens find
version de la déclaration +
n'est pas encore supporté, 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. C'est pourquoi je fournis ici les trois différentes techniques 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 variation :
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 à find -maxdepth 0
utiliser 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 (spawns) un sous-shell. L'idée vient de Bruno De Fraine et améliorée par teambob commentaire. Je conseille celui-ci si vous utilisez bash et si votre script ne doit pas ê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 : aucune 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 posté en 2007. Andrew Taylor 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 ..."
Note : ls
renvoie à $?=2
lorsque le répertoire n'existe pas. Mais aucune différence entre un fichier et un répertoire vide.
2 votes
Je pense que la réponse de Martin est la plus appropriée ici. La réponse actuellement acceptée n'est qu'un pseudo-code incomplet.
0 votes
En rapport : Vérifier à partir du shell script si un répertoire contient des fichiers