4031 votes

Comment vérifier si un répertoire existe dans un script shell

Quelle commande peut être utilisée pour vérifier si un répertoire est ou ne pas exister, à l'intérieur d'un script shell?

5472voto

Grundlefleck Points 29486

Pour vérifier si un répertoire existe dans un script shell, vous pouvez utiliser les éléments suivants:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

Ou pour vérifier si un répertoire n'existe pas:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

Cependant, comme Jon Ericsson points (grâce Jon), les commandes suivantes peuvent ne pas fonctionner comme prévu si vous ne prenez pas en compte qu'un lien symbolique vers un répertoire sera également passer cette case. E. g. l'exécution de cette:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

Produira le message d'erreur:

rmdir: failed to remove `symlink': Not a directory

Donc, les liens symboliques peuvent être traitées différemment, si les commandes ultérieures s'attendre à des répertoires:

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi

Prenez note en particulier de la double-guillemets utilisés pour envelopper les variables, la raison pour cela est expliqué par 8jean dans une autre réponse.

Si les variables contiennent des espaces ou d'autres caractères inhabituels, il ne sera probablement provoquer le script à l'échec.

567voto

8jean Points 2506

Grundlefleck a écrit:

if [ -d $DIRECTORY ]; then

N'oubliez pas de toujours placer les variables en double guillemets lors de l'interpolation dans un script bash. Les jeunes d'aujourd'hui grandissent avec l'idée qu'ils puissent avoir des espaces et beaucoup d'autres drôles de personnages dans leurs noms de répertoire. (Espaces! De retour dans mes jours, nous n'avions pas de fantaisie, des espaces!) ... ;)

Un jour, un de ces enfants va exécuter le script avec $DIRECTORY ensemble de "My M0viez" et le script va exploser. Vous ne voulez pas que. Donc de l'utiliser

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

au lieu de cela.

248voto

Jon Ericson Points 9703

@ Grundlefleck

Remarque l' -d test peut produire des résultats surprenants:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

Fichier sous: "Quand est-ce un répertoire n'est pas un répertoire?" La réponse: "Quand c'est un lien symbolique vers un répertoire." Un peu plus approfondie de test:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

(J'aurais fait un commentaire, car il n'est pas vraiment la bonne réponse, juste une explication sur la bonne réponse, mais la zone de commentaire est beaucoup trop contraignant. N'hésitez pas à ajouter ce matériau à la réponse elle-même.)

230voto

yukondude Points 8756

Je trouve le double support de la version de test rend l'écriture de la logique des tests plus naturel:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

194voto

elmarco Points 6329

Forme abrégée:

[ -d $DIR ] && echo "Yes"

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