131 votes

Recherche de répertoires vides

J'ai besoin de trouver des répertoires vides pour une liste donnée de répertoires. Certains répertoires contiennent des répertoires.

Si les répertoires intérieurs sont également vides, je peux dire que le répertoire principal est vide, sinon il ne l'est pas.

Comment puis-je tester cela ?

Par exemple :

A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty

2 votes

Je pense que la réponse de Martin est la plus appropriée ici. La réponse actuellement acceptée n'est qu'un pseudo-code incomplet.

0 votes

317voto

Martin Points 1346

Cela dépend un peu de ce que vous voulez faire avec les répertoires vides. J'utilise la commande ci-dessous lorsque je souhaite supprimer tous les répertoires vides dans un arbre, par exemple test répertoire.

find test -depth -empty -delete

Une chose à noter à propos de la commande ci-dessus est que il supprimera également les fichiers vides alors utilisez le -type d pour éviter cela.

find test -depth -type d -empty -delete

Drop -delete pour voir les fichiers et répertoires correspondants.

Si votre définition d'une arborescence de répertoires vide est qu'elle ne contient pas de fichiers, alors vous serez en mesure d'assembler quelque chose en vous basant sur les éléments suivants find test -type f ne renvoie rien.

find est un grand utilitaire, et RTFM tôt et souvent pour comprendre vraiment tout ce qu'il peut faire :-)

9 votes

-delete implique -depth (au moins pour GNU findutils 4.4.2)

5 votes

N'était pas au courant -empty si pratique !

3 votes

Cependant, sur une machine qui n'est pas le dernier et le meilleur linux. (EG Solaris), alors vous n'avez pas de fonctionnalités de recherche fantaisistes comme -empty ou -delete.

83voto

mosg Points 5271

Vous pouvez utiliser la commande suivante :

find . -type d -empty

1 votes

-empty ne fonctionne que si le répertoire courant est complètement vide, pas si le sous-arbre ne contient aucun fichier.

0 votes

Testé par @soField trouver . -type d -empty avec FreeBSD et CentOS. Cela fonctionne bien. Quel est votre OS ?

1 votes

Hp-ux pour qu'il n'y ait pas de paramètre vide

35voto

Marcelo Cantos Points 91211

Vérifiez si find <dir> -type f ne produit rien. Voici un exemple :

for dir in A B C; do
    [ -z "`find $dir -type f`" ] && echo "$dir is empty"
done

2 votes

Non, il n'affichera pas les sous-répertoires. C'est ce que le -type f est pour.

0 votes

Howerver, s'il y a fichiers vides votre solution ne donnera pas le message.

4 votes

Yasir : Je pense qu'un répertoire contenant un fichier vide n'est pas vide lui-même. Ne serait-ce pas le résultat correct ?

28voto

find directory -mindepth 1 -type d -empty -delete

C'est la version que j'ai trouvée la plus intéressante. Si elle est exécutée depuis l'intérieur répertoire il supprimera tous les répertoires vides situés en dessous (un répertoire est considéré comme vide s'il ne contient que des répertoires vides).

L'option mindepth empêche la suppression du répertoire lui-même s'il s'avère qu'il est vide.

2 votes

Vous pouvez poursuivre avec rmdir --ignore-fail-on-non-empty -p directory pour se débarrasser des parents aussi.

0 votes

@Pete Peterson Ma commande semble supprimer les répertoires qui ne contiennent que d'autres répertoires vides (ce que le PO semble également vouloir). Je note que votre commande laissera généralement l'utilisateur dans un répertoire avec un i-node manquant même s'il accomplit ce qu'il veut, ce qui peut être déroutant pour lui. Peut-être que je ne comprends pas.

18voto

olibre Points 6069

Trouvez juste les répertoires vides

Afin de trouver uniquement les répertoires vides (comme spécifié dans le titre de la question), la fonction La réponse de Mosg est correct :

find -type d -empty

Mais -empty peut ne pas être disponible sur les très anciennes find (c'est le cas de HP-UX par exemple). Si c'est votre cas, voyez les techniques décrites dans la section ci-dessous Un répertoire est-il vide ? .

Supprimer les répertoires vides

C'est un peu délicat : Supposons qu'un répertoire MyDir contient des répertoires vides. Après avoir supprimé ces répertoires vides, MyDir deviendra un répertoire vide et devra également être supprimé. J'utilise donc la commande rmdir avec l'option --parents (ou -p ) qui supprime également les répertoires parents lorsque cela est possible :

find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +

Sur les plus anciens find version de la déclaration + n'est pas encore supporté, vous pouvez donc utiliser ; à la place :

find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`

Un répertoire est-il vide ?

La plupart de ces réponses expliquent comment vérifier si un répertoire est vide. C'est pourquoi je fournis ici les trois différentes techniques que je connais :

  1. [ $(find your/dir -prune -empty) = your/dir ]

    d=your/dir
    if [ x$(find "$d" -prune -empty) = x"$d" ]
    then
      echo "empty (directory or file)"
    else
      echo "contains files (or does not exist)"
    fi

    une variation :

    d=your/dir
    if [ x$(find "$d" -prune -empty -type d) = x"$d" ]
    then
      echo "empty directory"
    else
      echo "contains files (or does not exist or is not a directory)"
    fi

    Explication :

    • find -prune est similaire à find -maxdepth 0 utiliser moins de caractères
    • find -type d imprime uniquement les répertoires
    • find -empty imprime les répertoires et fichiers vides

      > mkdir -v empty1 empty2 not_empty
      mkdir: created directory 'empty1'
      mkdir: created directory 'empty2'
      mkdir: created directory 'not_empty'
      > touch not_empty/file
      > find empty1 empty2 not_empty -prune -empty
      empty1
      empty2
  2. (( ${#files} ))

    Cette astuce est 100% bash mais invoque (spawns) un sous-shell. L'idée vient de Bruno De Fraine et améliorée par teambob commentaire. Je conseille celui-ci si vous utilisez bash et si votre script ne doit pas être portable.

    files=$(shopt -s nullglob dotglob; echo your/dir/*)
    if (( ${#files} ))
    then 
      echo "contains files"
    else 
      echo "empty (or does not exist or is a file)"
    fi

    Note : aucune différence entre un répertoire vide et un répertoire inexistant (et même lorsque le chemin fourni est un fichier).

  3. [ $(ls -A your/dir) ]

    Cette astuce est inspirée de L'article de nixCraft posté en 2007. Andrew Taylor répondu en 2008 et gr8can8dian en 2011.

    if [ "$(ls -A your/dir)" ]
    then
      echo "contains files"
    else
      echo "empty (or does not exist or is a file)"
    fi

    ou la version bashisme en une ligne :

    [[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."

    Note : ls renvoie à $?=2 lorsque le répertoire n'existe pas. Mais aucune différence entre un fichier et un répertoire vide.

0 votes

rmdir -vp m'a beaucoup aidé car je devais non seulement supprimer tous les répertoires vides sous un Root, mais aussi vérifier les répertoires vides et les répertoires parents après la suppression d'un fichier. Dans ma situation, les répertoires vides sont acceptés tant qu'ils ne se trouvent pas dans l'arborescence dont je suis en train de supprimer un fichier. Merci pour votre aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X