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

47

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?

    
posée justingrif 30.10.2011 - 03:44
la source

4 réponses

100

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.

    
réponse donnée Bill 30.10.2011 - 04:10
la source
8

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.

    
réponse donnée waltinator 27.12.2011 - 01:46
la source
7
rmdir *

supprimera tous les répertoires vides. Il crée une erreur pour chaque répertoire et fichier non vide, pour empêcher ces erreurs d’encombrer votre terminal, utilisez

rmdir * 2> /dev/null
    
réponse donnée evilsoup 11.12.2012 - 23:20
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 ça:

  • nous utilisons la fonction 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.
  • première liste-compréhension nous permet de créer empty , la liste de tous les répertoires vides, basée sur l’évaluation ci-dessus.
  • deuxième fonction, 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)
    
réponse donnée Sergiy Kolodyazhnyy 13.07.2017 - 05:24
la source

Lire d'autres questions sur les étiquettes