GNU/Linux >> Tutoriels Linux >  >> Linux

Comment vérifier si un fichier ou un répertoire existe dans Bash

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.


Linux
  1. Comment vérifier la progression de l'exécution de Cp ?

  2. Comment vérifier la sous-chaîne dans Shell Script Bash?

  3. Comment puis-je vérifier qu'un fichier existe et exécuter une commande sinon?

  4. Comment parser un fichier CSV dans Bash ?

  5. Comment puis-je vérifier si un répertoire existe ?

Ansible :vérifier si un fichier existe

Comment vérifier si un fichier ou un répertoire existe dans Bash

Comment lire des fichiers ligne par ligne dans Bash

Comment lire un fichier ligne par ligne dans Bash

Comment vérifier si un fichier ou un répertoire existe dans Bash Shell

Comment puis-je utiliser sudo pour vérifier si un fichier existe ?