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 ?
Réponses
Trop de publicités?Essayez cette commande :
find . -empty -type d -delete
Le site find
est utilisée pour rechercher les fichiers/répertoires correspondant à un critère de recherche particulier à partir du chemin d'accès spécifié, dans ce cas le répertoire courant (d'où la commande .
).
Le site -empty
L'option est valable pour tout fichier et répertoire vide.
Le site -type d
est valable pour l'option Datei spécifié ; dans ce cas d
représente le type de fichier répertoire .
Le site -delete
est l'action à effectuer, et s'applique à tous les fichiers trouvés dans la recherche.
Vous pouvez profiter de la rmdir
le refus de la commande de supprimer les répertoires non vides, et les find -depth
pour parcourir l'arborescence du répertoire de bas en haut :
find . -depth -exec rmdir {} \;
(et ignorer les erreurs), ou ajouter 2>/dev/null
pour vraiment les ignorer.
Le site -depth
option pour find
commence à trouver au bas de l'arborescence du répertoire.
rm -rf
supprimera tous les fichiers dans le répertoire (et ses sous-répertoires, et ....) ET toutes les répertoires et tout.
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
os.walk()
pour parcourir récursivement l'arbre des répertoires. A chaque itérationr
est défini comme le dossier actuel auquel nous accédons,s
contient la liste des répertoires dansr
yf
contiendra la liste des fichiers de ce dossier. Bien entendu, sif
ys
sont vides, nous savons quer
est vide. - La première liste de compréhension nous permet de créer
empty
la liste de tous les répertoires qui sont vides, sur la base de l'évaluation mentionnée ci-dessus. - deuxième fonction,
map()
est utilisé pour effectueros.rmdir()
sur chaque élément deempty
liste. La compréhension de la liste peut être utilisée comme une alternative.
En tant que script, ce serait ainsi :
#!/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)