Script Bash : comment vérifier la présence d’un fichier ou d’un dossier ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons voir comment vérifier la présence d'un dossier ou d'un fichier sur une machine Linux, à l'aide d'un script Bash. Ceci peut s'avérer très pratique pour tester la présence d'un élément avant d'effectuer une autre action (condition).
Tester l'existence d'un fichier ou d'un dossier, c'est quelque chose de basique et d'assez fréquent lorsque l'on écrit un script, que ce soit en Bash ou dans un autre langage. Par exemple, c'est utile pour s'assurer qu'un fichier de configuration existe avant de le modifier ou vérifier la présence d'un répertoire avant d'y copier des données.
Version originale de l'article : 27 décembre 2012
II. Syntaxe de la commande test
Pour effectuer cette opération, nous allons utiliser la commande test
ou directement son écriture "[ ]
". D'ailleurs, c'est bien la seconde écriture qui est généralement utilisée, mais il est important de faire le lien avec la commande d'origine. Sachez que la syntaxe basée sur des crochets simples "[ ]
" est disponible sur toutes les implémentations POSIX des shells Linux.
La commande test
offre plusieurs options permettant de vérifier la présence des fichiers et des dossiers, selon différents critères. Voici quelques-unes des plus utiles :
-d
: vérifie si l'élément spécifié est un répertoire.-f
: vérifie si l'élément spécifié est un fichier-e
: vérifie si l'élément existe, quel que soit son type (fichier, dossier, socket, etc.)-r
: vérifie si le fichier est lisible.-w
: vérifie si le fichier est inscriptible.-x
: vérifie si le fichier est exécutable.-s
: vérifie si le fichier existe et a une taille non nulle.-S
: vérifier si l'élément spécifié est un socket-L
: vérifie si le fichier est un lien symbolique.
Pour en savoir plus, vous pouvez consulter le manuel de la commande test.
III. Bash : vérifier la présence d'un dossier
Commençons par vérifier la présence d'un dossier dans un script, où nous allons effectuer notre test dans une structure conditionnelle if en Bash. Si nous cherchons à vérifier la présence du répertoire "/var/www/site
" avant d'y copier des données, nous allons effectuer ceci :
#!/bin/bash
# Variable pour définir le chemin du dossier à évaluer
repertoire="/var/www/site"
# Test pour vérifier si le dossier existe
if [ -d "$repertoire" ]; then
echo "Le dossier existe."
else
echo "Le dossier n'existe pas."
fi
Pour mieux comprendre ce bout de code, quelques explications s'imposent :
[ -d "$repertoire" ]
: teste si le chemin fourni correspond à un dossier existant, grâce à l'option "-d
" et à la présence des crochets "[ ]
"then
: si le répertoire existe (condition est vraie), le script affiche un message confirmant l'existence du dossier.else
: sinon, le répertoire n'existe pas, donc un message informe que le dossier n'existe pas (c'est facultatif)
Ici, le script retourne seulement une phrase dans la console en fonction du résultat du test. Pour effectuer une autre action (copier des fichiers, etc.), il suffirait de venir ajouter les instructions adéquates.
Vous pouvez aussi inverser le test : vérifier que le dossier n'existe pas. Cela s'effectue avec l'ajout du caractère "!
" pour inverser la condition.
#!/bin/bash
# Variable pour définir le chemin du dossier à évaluer
repertoire="/var/www/site"
# Test pour vérifier si le dossier existe
if [ ! -d "$repertoire" ]; then
echo "Le dossier n'existe pas."
fi
Ainsi, vous pouvez créer un script qui effectue une action uniquement si le dossier n'existe pas.
IV. Bash : vérifier la présence d'un fichier
Passons maintenant à la même opération, avec un fichier. Ce n'est pas plus compliqué, la seule différence étant l'option à utiliser au niveau du test ! Nous devons utiliser l'option "-f
" (file) de la commande test
, à la place de l'option "-d
" (directory).
Ici, nous souhaitons tester la présence du fichier "/var/www/site/config.php
" :
#!/bin/bash
# Variable pour définir le chemin du fichier à évaluer
fichier="/var/www/site/config.php"
# Test pour vérifier si le fichier existe
if [ -f "$fichier" ]; then
echo "Le fichier existe."
else
echo "Le fichier n'existe pas."
fi
Si vous ne souhaitez pas utiliser les crochets, mais plutôt la commande test
en elle-même, vous pouvez utiliser cette syntaxe :
#!/bin/bash
# Variable pour définir le chemin du fichier à évaluer
fichier="/var/www/site/config.php"
# Test pour vérifier si le fichier existe
if test -f "$fichier"; then
echo "Le fichier existe."
else
echo "Le fichier n'existe pas."
fi
Par ailleurs, vous pouvez aussi évaluer la présence de plusieurs fichiers (ou dossiers) en ajoutant un opérateur dans le test if
. L'exemple ci-dessous vérifie à la fois la présence d'un fichier et d'un dossier, grâce à l'ajout de l'opérateur "-a
" (AND).
#!/bin/bash
if [ -f "/var/www/site/config.php" -a -d "/var/www/site/" ]; then
echo "Le fichier et le dossier existent !"
fi
V. Utiliser la commande test sans if
Vous pouvez également utiliser la commande test
sans l'instruction if, grâce à l'utilisation de l'enchainement des commandes Linux. Nous allons utiliser l'opérateur &&
puisqu'il permet d'exécuter une commande uniquement si la commande précédente a réussi (si elle retourne vraie).
Ce qui pourrait donner la syntaxe suivante :
test -f "/var/www/site/config.php" && echo "Le fichier existe !"
Le texte "Le fichier existe !
" sera retourné dans la console uniquement si le fichier existe. Nous pourrions, à la place de ce texte, exécuter une autre commande, notamment pour modifier le fichier, le supprimer, etc.
VI. Conclusion
En tant qu'administrateur système, si vous êtes amené à rédiger des scripts Bash, il y a des chances pour que vous ayez le besoin de tester la présence (ou l'absence) d'un fichier ou d'un dossier. Désormais, vous disposez de plusieurs exemples pour effectuer ce test dans vos scripts Bash !
Top merci
Bonjour,
Comment tester l’existance d’un fichier avec un lien relatif ?
~/installeur
Pour le moment, je suis » obligé » de saisir un chemin complet pour tester.
/home/user/installeur
bonjour,
svp comment vérifier si un fichier existe sur un serveur linux?
Bonjour,
J’aimerai faire me connecter à un serveur et voir si un fichier existe. Tout ça doit se faire sur une seule ligne.
S’il vous plaît
Bonjour
J’aurais souhaiter créer un script shell qui l’état de plusieurs jobs sous autosys:
– entree Les jobs à vérifier
– checker leur eta via la commande “autorep -j”
– si retour RU ils sont en running
– il continue à tourner
– si Les jobs sont tous en SU
– le script s’arrête de tourner