Souvent, lors de l'écriture de scripts Shell, vous pouvez vous retrouver dans une situation où vous devez effectuer une action en fonction de l'existence ou non d'un fichier.
Dans Bash, vous pouvez utiliser la commande test pour vérifier si un fichier existe et déterminer le type du fichier.
La commande de test prend l'une des formes de syntaxe suivantes :
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
Si vous voulez que votre script soit portable, vous devriez préférer utiliser l'ancien test [
, qui est disponible sur tous les shells POSIX. La nouvelle version mise à jour de la commande de test [[
(double crochets) est pris en charge sur la plupart des systèmes modernes utilisant Bash, Zsh et Ksh comme shell par défaut.
Vérifier si le fichier existe #
Lors de la vérification de l'existence d'un fichier, les opérateurs FILE les plus couramment utilisés sont -e
et -f
. Le premier vérifiera si un fichier existe quel que soit son type, tandis que le second renverra vrai uniquement si le FICHIER est un fichier normal (pas un répertoire ou un périphérique).
L'option la plus lisible pour vérifier si un fichier existe ou non est d'utiliser le test
commande en combinaison avec le if
déclaration. N'importe lequel des extraits ci-dessous vérifiera si le /etc/resolv.conf
fichier existe :
FILE=/etc/resolv.conf
if test -f "$FILE"; then
echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [[ -f "$FILE" ]]; then
echo "$FILE exists."
fi
Si vous souhaitez effectuer une action différente selon que le fichier existe ou non, utilisez simplement la construction if/then :
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
echo "$FILE exists."
else
echo "$FILE does not exist."
fi
Utilisez toujours des guillemets doubles pour éviter les problèmes lorsque vous traitez des fichiers contenant des espaces dans leurs noms.
Vous pouvez également utiliser la commande test sans l'instruction if. La commande après le &&
l'opérateur ne sera exécuté que si l'état de sortie de la commande de test est vrai,
test -f /etc/resolv.conf && echo "$FILE exists."
[ -f /etc/resolv.conf ] && echo "$FILE exists."
[[ -f /etc/resolv.conf ]] && echo "$FILE exists."
Si vous souhaitez exécuter une série de commandes après le &&
opérateur placez simplement les commandes entre accolades séparées par ;
ou &&
:
[ -f /etc/resolv.conf ] && { echo "$FILE exist."; cp "$FILE" /tmp/; }
Opposé à &&
, l'instruction après le ||
l'opérateur ne sera exécuté que si l'état de sortie de la commande de test est false
.
[ -f /etc/resolv.conf ] && echo "$FILE exist." || echo "$FILE does not exist."
Vérifier si le répertoire existe #
Les opérateurs -d
permet de tester si un fichier est un répertoire ou non.
Par exemple pour vérifier si le /etc/docker
répertoire existe que vous utiliseriez :
FILE=/etc/docker
if [ -d "$FILE" ]; then
echo "$FILE is a directory."
fi
[ -d /etc/docker ] && echo "$FILE is a directory."
Vous pouvez également utiliser les doubles crochets [[
au lieu d'un seul [
.
Vérifier si le fichier n'existe pas #
Semblable à de nombreux autres langages, l'expression de test peut être inversée en utilisant le !
(point d'exclamation) opérateur non logique :
FILE=/etc/docker
if [ ! -f "$FILE" ]; then
echo "$FILE does not exist."
fi
Comme ci-dessus :
[ ! -f /etc/docker ] && echo "$FILE does not exist."
Vérifier si plusieurs fichiers existent #
Au lieu d'utiliser des constructions if/else imbriquées compliquées, vous pouvez utiliser -a
(ou &&
avec [[
) pour tester si plusieurs fichiers existent :
if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
echo "Both files exist."
fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then
echo "Both files exist."
fi
Variantes équivalentes sans utiliser l'instruction IF :
[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."
Opérateurs de test de fichiers #
La commande de test inclut les opérateurs FILE suivants qui vous permettent de tester des types de fichiers particuliers :
-b
FILE
- Vrai si le FICHIER existe et est un fichier de bloc spécial.-c
FILE
- Vrai si le FICHIER existe et est un fichier de caractères spéciaux.-d
FILE
- Vrai si le FICHIER existe et est un répertoire.-e
FILE
- Vrai si le FICHIER existe et est un fichier, quel que soit son type (nœud, répertoire, socket, etc.).-f
FILE
- Vrai si le FICHIER existe et s'il s'agit d'un fichier normal (et non d'un répertoire ou d'un périphérique).-G
FILE
- Vrai si le FICHIER existe et appartient au même groupe que l'utilisateur exécutant la commande.-h
FILE
- Vrai si le FICHIER existe et est un lien symbolique.-g
FILE
- Vrai si le FILE existe et a set-group-id (sgid
) jeu d'indicateurs.-k
FILE
- Vrai si le FICHIER existe et qu'un indicateur de bit collant est défini.-L
FILE
- Vrai si le FICHIER existe et est un lien symbolique.-O
FILE
- Vrai si le FICHIER existe et appartient à l'utilisateur qui exécute la commande.-p
FILE
- Vrai si le FICHIER existe et est un tube.-r
FILE
- Vrai si le FICHIER existe et est lisible.-S
FILE
- Vrai si le FICHIER existe et est une socket.-s
FILE
- Vrai si le FICHIER existe et a une taille non nulle.-u
FILE
- Vrai si le FICHIER existe, et set-user-id (suid
) l'indicateur est défini.-w
FILE
- Vrai si le FICHIER existe et est accessible en écriture.-x
FILE
- Vrai si le FICHIER existe et est exécutable.
Conclusion #
Dans ce guide, nous vous avons montré comment vérifier si un fichier ou un répertoire existe dans Bash.
Si vous avez des questions ou des commentaires, n'hésitez pas à laisser un commentaire.