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 dans une seule 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 dans une seule commande?
Essayez cette commande:
find . -empty -type d -delete
La commande find
est utilisée pour rechercher des fichiers / répertoires correspondant à un critère de recherche particulier à partir du chemin spécifié, en l'occurrence le répertoire en cours (d'où le .
).
L'option -empty
est vraie pour tous les fichiers et répertoires vides.
L'option -type d
est vraie pour le type fichier spécifié; dans ce cas, d
représente le type de fichier répertoire .
L’option -delete
est l’action à effectuer et s’applique à 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
de parcourir l’arborescence des répertoires bottom-up:
find . -depth -exec rmdir {} \;
(et ignorez les erreurs), ou ajoutez 2>/dev/null
pour vraiment les ignorer.
L'option -depth
à find
commence à trouver en bas de l'arborescence.
rm -rf
supprimera tous les fichiers dans le répertoire (et ses sous-répertoires et ....) ET tous les répertoires et tout.
$ 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 ça:
os.walk()
pour parcourir récursivement l'arborescence de répertoires. Sur chaque itération, r
est défini sur le dossier courant auquel nous accédons, s
contient la liste des répertoires dans r
et f
contiendra la liste des fichiers dans 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, basée sur l’évaluation ci-dessus. map()
est utilisé pour effectuer os.rmdir()
sur chaque élément de la liste empty
. La compréhension de liste pourrait être utilisée aussi bien que alternative. En tant que script, ce serait comme ça:
#!/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)
Lire d'autres questions sur les étiquettes command-line directory delete