Dites 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?
Dites 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:
Essayez cette commande:
find . -empty -type d -delete
La findcommande est utilisée pour rechercher des fichiers / répertoires correspondant à un critère de recherche particulier à partir du chemin spécifié, dans ce cas le répertoire actuel (d'où le .).
L' -emptyoption est valable pour tous les fichiers et répertoires vides.
L' -type doption est vraie pour le type de fichier spécifié. dans ce cas dreprésente le type de fichier répertoire .
L' -deleteoption est l'action à effectuer et reste vraie pour tous les fichiers trouvés dans la recherche.
rm -rf <directory-name>. Cela supprimera le répertoire, ainsi que tout son contenu, y compris les fichiers et les sous-répertoires. L' -roption signifie supprimer récursivement, tandis que la -fcommande signifie ne pas demander avant la suppression. Si vous souhaitez être invité avant la suppression d'un répertoire / fichier, remplacez l' -foption par l' -ioption.
stdoutcommande d’une commande (par exemple find) dans la commande stdinde l’autre (par exemple rm). Cependant, soyez très prudent, car elle risquerait d’effacer ou de supprimer des fichiers / répertoires que vous ne souhaitez pas supprimer. effacer! Pour plus d'informations sur cette opération, voir les manpages correspondant à chacune de ces commandes. Pour plus de sécurité, testez toujours de telles choses dans un répertoire temporaire avant d'essayer des choses réelles.
Vous pouvez tirer parti du rmdirrefus de la commande de supprimer les répertoires non vides et de l' find -depthoption permettant de parcourir l'arborescence de répertoires de bas en haut:
find . -depth -exec rmdir {} \;
(et ignorer les erreurs), ou ajouter 2>/dev/nullpour vraiment les ignorer.
L' -depthoption pour findcommencer à chercher au bas de l'arborescence.
rm -rfsupprimera 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
rmdir * 2>/dev/null || true. (La méthode find (1) est préférable pour les scripts, mais pour une autre raison: car elle exprime mieux ce que vous voulez faire.)
$HOME. Avec un sourire diabolique.
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()fonction pour parcourir récursivement l'arborescence. À chaque itération, rle dossier en cours auquel nous accédons est défini. Il scontient la liste des répertoires ret fcontient la liste des fichiers de ce dossier. Bien sûr si fet ssont vides, nous savons que rc'est vide.emptyla 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()chaque élément de la emptyliste. 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)
/bin/shseulement et Python est en fait un langage plus élégant que ces deux-là