Quelle commande peut être utilisée pour vérifier si un répertoire existe ou non, dans un script shell ?
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 le souligne Jon Ericson, les commandes suivantes peuvent ne pas fonctionner comme prévu si vous ne tenez pas compte du fait qu'un lien symbolique vers un répertoire passera également cette vérification. Par exemple, en exécutant cette commande :
ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then
rmdir "$SYMLINK"
fi
produira le message d'erreur suivant :
rmdir: failed to remove `symlink': Not a directory
Les liens symboliques doivent donc être traités différemment, si les commandes suivantes s'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
Notez en particulier les guillemets doubles 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.
Notez que le test -d peut donner 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-il 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 trouverez plus d'informations dans le manuel Bash sur les [expressions conditionnelles Bash] (https://www.gnu.org/software/bash/manual/bash.html#Bash-Conditional-Expressions), la [[
] commande intégrée] (https://www.gnu.org/software/bash/manual/bash.html#index-_005b) et la [`[[
] commande composée] (https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b).
find
Vérifie l'existence du dossier dans les sous-répertoires :
found=`find -type d -name "myDirectory"`
si [ -n "$found" ;]
then
# La variable 'found' ; contient le chemin complet où se trouve "myDirectory" ;.
# Elle peut contenir plusieurs lignes s'il y a plusieurs dossiers nommés "myDirectory" ;.
fi
Vérifier l'existence d'un ou plusieurs dossiers basés sur un motif dans le répertoire courant :
found=``find -maxdepth 1 -type d -name "my*"``
if [ -n "$found" ;]
then
# La variable 'found' ; contient le chemin complet où les dossiers "my*" ; ont été trouvés.
fi
Les deux combinaisons. Dans l'exemple suivant, elle vérifie l'existence du dossier dans le répertoire courant :
found=`find -maxdepth 1 -type d -name "myDirectory"`
if [ -n "$found" ;]
then
# La variable 'found' ; n'est pas vide => "myDirectory"` existe.
fi