web-dev-qa-db-fra.com

comment supprimer récursivement les répertoires vides de mon répertoire personnel?

Duplicata possible:
Comment supprimer tous les répertoires vides d'un sous-arbre?

Je crée très souvent des répertoires, dispersés sur mon répertoire personnel, et je trouve très difficile de les localiser et de les supprimer.

Je veux que tout alias/fonction/script trouve/localise et supprime tous les répertoires vides de mon répertoire personnel.

158
Santosh Kumar

La commande find est le principal outil pour les opérations récursives du système de fichiers. Utilisez le -type d expression pour indiquer à find que vous souhaitez rechercher uniquement des répertoires (et non des fichiers simples). La version GNU de find prend en charge -empty test, donc

$ find . -type d -empty -print

imprimera tous les répertoires vides sous votre répertoire actuel.

Utilisation find ~ -… ou find "$HOME" -… pour baser la recherche sur votre répertoire personnel (s'il ne s'agit pas de votre répertoire actuel).

Après avoir vérifié que cela sélectionne les répertoires appropriés, utilisez -delete pour supprimer toutes les correspondances:

$ find . -type d -empty -delete
310
Baldrick

Vous pouvez appeler rmdir sur chaque répertoire, puisque rmdir ne supprimera un répertoire que s'il est vide:

find "$HOME" -type d -exec rmdir {} + 2>/dev/null

Si vous souhaitez également imprimer les répertoires supprimés, vous devrez vérifier s'ils sont vides:

find "$HOME" -type d -exec bash -c 'shopt -s nullglob; shopt -s dotglob; files=("$1"/*); [[ ${files[@]} ]] || rmdir -v "$1"' -- {} \; 

Voici un exemple de bash pur (version 4 ou supérieure):

shopt -s globstar
for dir in **/; do
   files=("$dir"/*)
   [[ ${files[@]} ]] || rmdir -v "$dir"
done
15
jordanm