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?
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.
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.
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
find . -type d -empty -delete -maxdepth 1
Car si vous souhaitez uniquement supprimer les sous-répertoires directs de foo/
.
$ 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:
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.empty
, la liste de tous les répertoires vides, en fonction de l'évaluation indiquée ci-dessus.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)