Comment puis-je supprimer tous les répertoires vides d'un répertoire à partir de la ligne de commande?

58

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?

justingrif
la source

Réponses:

119

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.

Facture
la source
Je pense que c'est la façon la plus simple de le faire, donc je vais y aller et marquer ceci comme étant une réponse.
Justingrif
Hé, Bill, j'ai essayé de poser une autre question similaire et elle ne m'a pas laissé faire parce que c'était une dupe, alors j'espérais que tu serais capable de me répondre ici. Supposons que je veuille faire la même chose que ci-dessus mais que tous les répertoires soient vides ou non.
Justingrif
3
La façon dont vous supprimer des répertoires, peu importe si oui ou non ils sont vides, tapez la commande suivante: 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.
Bill
Que faire s'il y avait des fichiers dans ledit répertoire que je voulais conserver? Je voulais donc supprimer tous les répertoires de / foo / bar / mais conserver tous les fichiers qui pourraient s'y trouver.
Justingrif
2
Il est possible de le faire en utilisant un tuyau pour insérer la 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.
Bill
11

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.

Waltinator
la source
8
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
maux de tête
la source
Ce n'est pas approprié pour les scripts car il se terminera avec un code d'état différent de zéro mais cela fonctionne.
the_drow
@ the_drow comment cela rend-il inapproprié? Par ailleurs, vous pouvez également utiliser 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.)
Alois Mahdal
Je fais souvent ça à $HOME. Avec un sourire diabolique.
Alois Mahdal
Parce qu'il signalera un échec si certains des répertoires ne sont pas vides.
the_drow
est-ce plus rapide que la méthode find? Quelqu'un at-il comparé les deux?
Xerus
1
find . -type d -empty -delete -maxdepth 1

Car si vous souhaitez uniquement supprimer les sous-répertoires directs de foo/.

Simon Baars
la source
0

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()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.
  • première liste-compréhension nous permet de créer emptyla liste de tous les répertoires vides, en fonction de l'évaluation indiquée ci-dessus.
  • La deuxième fonction 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)
Sergiy Kolodyazhnyy
la source
trop compliqué pour simplement des questions :(
nurulhudamustaqim
@nurulhudamustaqim Dépend du point de vue. Pour beaucoup d'utilisateurs de Linux habitués à Python, c'est en fait très modeste :) Et en plus de sa variété. L'administration système moderne ne se limite pas à bash ou /bin/shseulement et Python est en fait un langage plus élégant que ces deux-là
Sergiy Kolodyazhnyy