Question Vérifiez si un répertoire existe dans un script shell


Quelle commande peut être utilisée pour vérifier si un répertoire existe ou non, dans un script shell?


2988
2017-09-12 20:06


origine


Réponses:


Pour vérifier si un répertoire existe dans un script shell, vous pouvez utiliser ce qui suit:

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 Ericson souligne, les commandes suivantes peuvent ne pas fonctionner comme prévu si vous ne prenez pas en compte le fait qu'un lien symbolique vers un répertoire passera également cette vérification. Par exemple. courir ceci:

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

Va produire le message d'erreur:

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

Les liens symboliques doivent donc être traités différemment si les commandes suivantes attendent 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 particulièrement note des guillemets utilisés pour envelopper les variables, la raison en est expliquée par 8jean dans une autre réponse.

Si les variables contiennent des espaces ou d'autres caractères inhabituels, le script échouera probablement.


4132
2017-09-12 20:07



N'oubliez pas de toujours placer les variables entre guillemets lorsque vous les référencez un script bash. Les enfants de nos jours grandissent avec l'idée qu'ils peuvent avoir des espaces et beaucoup d'autres personnages amusants dans leurs noms de répertoires. (Les espaces! De retour dans mes jours, nous n'avions pas d'espaces fantaisie!))

Un jour, un de ces enfants exécutera votre script avec $DIRECTORY mis à "My M0viez" et votre script va exploser. Tu ne veux pas ça. Alors utilisez ceci.

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

454
2017-09-15 22:00



Noter la -ré 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 un répertoire n'est pas un répertoire?" La réponse: "Quand c'est un lien symbolique vers un répertoire." Un test un peu plus approfondi:

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

Vous pouvez trouver plus d'informations dans le manuel de Bash sur Bash expressions conditionnelles et le [ commande intégrée et le [[ composé commmand.


203
2017-09-12 20:26



Je trouve le double-support version de test rend l'écriture de tests logiques plus naturelle:

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

198
2017-09-12 21:33



Forme plus courte:

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

125
2017-09-12 21:08



Pour vérifier si un répertoire existe, vous pouvez utiliser simple si structure comme ceci:

if [ -d directory/path to a directory ] ; then
#Things to do

else #if needed #also: elif [new condition] 
# things to do
fi

Vous pouvez le faire aussi en négatif

if [ ! -d directory/path to a directory ] ; then
# things to do when not an existing directory

Remarque: Soyez prudent, laissez des espaces vides de chaque côté des deux accolades d'ouverture et de fermeture.

Avec la même syntaxe, vous pouvez utiliser:

-e: any kind of archive 

-f: file 

-h: symbolic link 

-r: readable file 

-w: writable file 

-x: executable file 

-s: file size greater than zero 

118
2018-04-08 02:50



if [ -d "$DIRECTORY" ]; then  
    # Here if $DIRECTORY exists  
fi

94
2018-04-15 08:07



Vous pouvez utiliser test -d (voir man test).

-d file       Vrai si le fichier existe et est un répertoire.

Par exemple:

test -d "/etc" && echo Exists || echo Does not exist

Noter la test commande est la même que l'expression conditionnelle [ (voir: man [), il est donc portable sur des scripts shell.

[ - Ceci est un synonyme de test intégré, mais le dernier argument doit être un littéral ], pour correspondre à l'ouverture [.

Pour des options possibles ou une aide supplémentaire, vérifiez:

  • help [
  • help test
  • man test ou man [

73
2017-09-12 21:25