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 find
commande 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' -empty
option est valable pour tous les fichiers et répertoires vides.
L' -type d
option est vraie pour le type de fichier spécifié. dans ce cas d
représente le type de fichier répertoire .
L' -delete
option 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' -r
option signifie supprimer récursivement, tandis que la -f
commande signifie ne pas demander avant la suppression. Si vous souhaitez être invité avant la suppression d'un répertoire / fichier, remplacez l' -f
option par l' -i
option.
stdout
commande d’une commande (par exemple find
) dans la commande stdin
de 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 man
pages 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 rmdir
refus de la commande de supprimer les répertoires non vides et de l' find -depth
option permettant de parcourir l'arborescence de répertoires de bas en haut:
find . -depth -exec rmdir {} \;
(et ignorer les erreurs), ou ajouter 2>/dev/null
pour vraiment les ignorer.
L' -depth
option pour find
commencer à chercher 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
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, r
le dossier en cours auquel nous accédons est défini. Il s
contient la liste des répertoires r
et f
contient la liste des fichiers de ce dossier. Bien sûr si f
et s
sont vides, nous savons que r
c'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()
chaque élément de la empty
liste. 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/sh
seulement et Python est en fait un langage plus élégant que ces deux-là