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?
Réponses
Trop de publicités?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.
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.
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.)
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