web-dev-qa-db-fra.com

Comment puis-je supprimer tous les répertoires vides d'un répertoire à partir de la ligne de commande?

Disons que j'ai un répertoire nommé foo/. Ce dossier comprend des sous-répertoires. Comment puis-je supprimer tous les répertoires vides en une seule commande?

58
justingrif

Essayez cette commande:

find . -empty -type d -delete

La commande find sert à rechercher les fichiers/répertoires correspondant à un critère de recherche particulier dans le chemin spécifié, dans ce cas le répertoire en cours (d'où le .).

L'option -empty est vérifiée pour tous les fichiers et répertoires vides.

L'option -type d est vérifiée pour le type fichier spécifié; dans ce cas, d correspond au type de fichier répertoire.

L'option -delete est l'action à exécuter et reste vraie pour tous les fichiers trouvés dans la recherche.

118
Bill

Vous pouvez tirer parti du refus de la commande rmdir de supprimer des répertoires non vides et de l’option find -depth pour parcourir l’arborescence de répertoires de bas en haut:

find . -depth -exec rmdir {} \;  

(et ignorez les erreurs), ou ajoutez 2>/dev/null pour les ignorer.

L'option -depth de find commence à être trouvée au bas de l'arborescence.

rm -rf supprimera tous les fichiers du répertoire (et ses sous-répertoires et ....) ET tous les répertoires et tout.

11
waltinator
rmdir *

Supprime tous les répertoires vides. Cela produira une erreur pour chaque répertoire et fichier non vide, pour éviter que ces erreurs encombrent votre terminal, utilisez

rmdir * 2> /dev/null
8
evilsoup
find . -type d -empty -delete -maxdepth 1

Car si vous souhaitez uniquement supprimer les sous-répertoires directs de foo/.

1
Simon Baars

Approche python

$ tree                                                                                                                                                                                  
.
├── empty_dir1
├── empty_dir2
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

Cela fonctionne comme suit:

  • nous utilisons la fonction os.walk() pour parcourir récursivement l’arborescence de répertoires. À chaque itération, r est défini sur le dossier en cours auquel nous accédons, s contient la liste des répertoires contenus dans r et f contient la liste des fichiers de ce dossier. Bien sûr, si f et s sont vides, nous savons que r est vide.
  • première liste-compréhension nous permet de créer empty, la liste de tous les répertoires vides, en fonction de l'évaluation indiquée ci-dessus.
  • la deuxième fonction, map(), est utilisée pour exécuter os.rmdir() sur chaque élément de la liste empty. La compréhension de la liste pourrait être utilisée aussi bien que la solution de rechange.

En tant que script, ce serait comme suit:

#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
    if not f and not s and r != ".":
        empty.append(r)

for i in empty:
    os.rmdir(i)
0
Sergiy Kolodyazhnyy