Comment vérifier si un fichier existe dans les scripts Linux Bash

0
308
fatmawati achmad zaenuri/Shutterstock.com

Si un script Linux Bash repose sur la présence de certains fichiers ou répertoires, il ne peut pas simplement supposer qu'ils le sont. Il doit vérifier qu'ils sont bien présents. Voici comment procéder.

Ne supposez rien

Lorsque vous écrivez un script, vous ne peut pas faire d'hypothèses sur ce qui est et n'est pas présent sur un ordinateur. C'est d'autant plus vrai si le script doit être distribué et exécuté sur de nombreux ordinateurs différents. Tôt ou tard, le script s'exécutera sur un ordinateur qui ne répond pas à vos hypothèses, et le script échouera ou s'exécutera de manière imprévisible.

Tout ce que nous apprécions ou créons sur un ordinateur est stocké dans un fichier d'un certain format, et tous ces fichiers résident dans un répertoire. Les scripts peuvent lire, écrire, renommer, supprimer et déplacer des fichiers et des répertoires – tout ce que vous pouvez faire sur la ligne de commande.

L'avantage que vous avez en tant qu'être humain est que vous pouvez voir le contenu de un répertoire et vous savez si un fichier existe ou non – ou si le répertoire attendu existe même. Si un script se trompe lorsqu'il manipule des fichiers, cela peut avoir des résultats graves et dommageables.

Bash fournit un ensemble complet de tests que vous pouvez utiliser pour détecter des fichiers et des répertoires et tester bon nombre de leurs attributs. Les incorporer dans des scripts est facile, mais les avantages en termes de robustesse et de contrôle fin sont considérables.

CONNEXE : Comment utiliser les tests conditionnels à double crochet sous Linux

La gamme de tests

En combinant l'instruction if avec le test approprié à partir d'une grande collection de tests de fichiers et de répertoires, nous pouvons facilement déterminer si un fichier existe, s'il est exécutable ou inscriptible, et bien plus encore.

  • -b : renvoie vrai si le fichier est un fichier spécial bloc.
  • -c : renvoie vrai si le fichier est spécial caractère.
  • -d : renvoie vrai si le “fichier” est un répertoire.
  • -e : renvoie vrai si le fichier existe.
  • -f : renvoie vrai si le fichier existe et est un fichier normal.
  • -g : renvoie vrai si le fichier a l'ensemble d'autorisations setgid (chmod g+).
  • -h : renvoie vrai si le fichier est un lien symbolique.
  • -L : renvoie vrai si le fichier est un lien symbolique.
  • -k : renvoie vrai si son sticky bit est défini (chmod +t) .
  • -p : renvoie vrai si le fichier est un tube nommé.
  • -r : renvoie vrai si le fichier est lisible.
  • -s : renvoie true si le fichier existe et n'est pas vide.
  • -S: Renvoie vrai si le fichier est une socket.
  • -t : Renvoie vrai si le descripteur de fichier est ouvert dans un terminal.
  • – u : renvoie true si le fichier possède l'ensemble d'autorisations setuid (chmod u+).
  • -w : renvoie true si le fichier est accessible en écriture.
  • -x : renvoie vrai si le fichier est exécutable.
  • -O : renvoie vrai si vous en êtes le propriétaire.
  • -G : renvoie vrai si appartient à votre groupe.
  • -N : renvoie vrai si le fichier a été modifié depuis sa dernière lecture.
  • ! : l'opérateur logique NON.
  • && : L'opérateur logique ET.
  • || : L'opérateur logique OU.

La liste commence par -b car le test -a est obsolète et remplacé par le test -e.

RELATED : Comment utiliser SUID , SGID et Sticky Bits sous Linux

Utilisation des tests dans les scripts

Le fichier générique test if statement est une construction de script simple. La comparaison à l'intérieur des doubles parenthèses ” [[ ]] ” utilise le test -f pour déterminer si un fichier normal existe avec ce nom.

Copiez le texte de ce script dans un éditeur et enregistrez-le dans un fichier appelé “script1.sh”, et utilisez chmod pour le rendre exécutable.

#!/bin/bash if [[ -f $1 ]] then   echo “Le fichier $1 existe.” else   echo “Le fichier $1 est introuvable.” fi

Vous devez passer le nom du fichier au script sur la ligne de commande.

chmod +x script1.sh

Vous devrez faire cela avec chaque script si vous voulez essayer les autres exemples de l'article.

Essayons le script sur un fichier texte simple.

./script1.sh test-file.txt

Le fichier existe et le script signale correctement ce fait. Si nous supprimons le fichier et réessayons, le test devrait échouer et le script devrait nous le signaler.

./script1.sh test-file.txt

Dans une situation réelle, votre script devrait prendre toutes les mesures appropriées. Peut-être qu'il signale l'erreur et s'arrête. Peut-être qu'il crée le fichier et continue. Il peut copier quelque chose d'un répertoire de sauvegarde pour remplacer le fichier manquant. Tout dépend du but du script. Mais au moins maintenant, le script est capable de prendre la décision en fonction de savoir si le fichier est présent ou non.

L'indicateur -f teste si le fichier est présent et s'il s'agit d'un “régulier&# 8221 ; dossier. En d'autres termes, ce n'est pas quelque chose qui semble être un fichier mais qui ne l'est pas, comme un fichier de périphérique.

Nous utiliserons ls pour vérifier que le &# 8220;/dev/aléatoire” fichier existe, puis voyez ce que le script en fait.

ls -lh /dev/random ./script /dev/random

Parce que notre script teste les fichiers normaux et “/dev/random” est un fichier de périphérique, le test échoue. Très souvent, pour savoir si un fichier existe, vous devez choisir avec soin le test que vous utilisez, ou vous devez utiliser plusieurs tests.

C'est “script2.sh” , qui teste les fichiers normaux et les fichiers de périphérique de caractères.

#!/bin/bash if [[ -f $1 ]] then   echo “Le fichier $1 existe.” else   echo “Le fichier $1 est manquant ou n'est pas un fichier normal.” fi if [[ -c $1 ]] then   echo “Le fichier $1 est un fichier de périphérique de caractères.” else   echo “Le fichier $1 est manquant ou n'est pas un fichier spécial.” fi

Si nous exécutons ce script sur le “/dev/random” device file, le premier test échoue, ce que nous attendons, et le second test réussit. Il reconnaît le fichier comme un fichier de périphérique.

./script2.sh /dev/random

En fait, il le reconnaît comme un fichier de périphérique de caractère. Certains fichiers de périphérique sont des fichiers de périphérique de bloc. Dans l'état actuel des choses, notre script n'y parviendra pas.

./script2.sh /dev/sda

< /p>

Nous pouvons utiliser l'opérateur logique OR et inclure un autre test dans la seconde instruction if. Cette fois, que le fichier soit un fichier de périphérique de caractères ou un fichier de périphérique de bloc, le test renverra vrai. C'est “script3.sh.”

#!/bin/bash if [[ -f $1 ]] then   echo “Le fichier $1 existe.” else   echo “Le fichier $1 est manquant ou n'est pas un fichier normal.” fi si [[ -c $1 || -b $1 ]] then   echo “Le fichier $1 est un fichier de périphérique de caractères ou de bloc.” else   echo “Le fichier $1 est manquant ou n'est pas un fichier spécial.” fi

Ce script reconnaît à la fois les fichiers de périphériques de caractères et de périphériques de blocs.

./script3.sh /dev/random ./script3.sh /dev/sda

S'il est important pour vous de différencier les différents types de fichiers de périphérique, vous pouvez utiliser des instructions if imbriquées. C'est “script4.sh.”

#!/bin/bash if [[ -f $1 ]] then   echo “Le fichier $1 existe.” else   echo “Le fichier $1 est manquant ou n'est pas un fichier normal.” fi if [[ -c $1 ]] then   echo “Le fichier $1 est un fichier de périphérique de caractères.” else   if [[ -b $1 ]]   then     echo “Le fichier $1 est un fichier de périphérique bloc.” else     echo “Le fichier $1 est manquant ou n'est pas un fichier de périphérique.” fi fi

Ce script reconnaît et catégorise les fichiers de périphériques de caractères et de périphériques de blocs.

./script4.sh /dev/random ./script4.sh /dev/sda

En utilisant l'opérateur logique ET, nous pouvons tester plusieurs caractéristiques à la fois. C'est “script5.sh.” Il vérifie qu'un fichier existe et que le script dispose des autorisations de lecture et d'écriture pour celui-ci.

#!/bin/bash si [[ -f $1 && -r $1 && -w $1 ]] then   echo “Le fichier $1 existe et nous avons les droits de lecture/écriture.” else   echo “Le fichier $1 est manquant, ce n'est pas un fichier normal, ou nous ne pouvons pas y lire/écrire.” fi

Nous allons exécuter le script sur un fichier qui nous appartient et qui appartient à la racine.

./script5.sh .bashrc ./script5.sh /etc/fstab

Pour tester l'existence d'un répertoire, utilisez le test -d. C'est “script6.sh.” Il fait partie d'un script de sauvegarde. La première chose qu'il fait est de vérifier si le répertoire passé sur la ligne de commande existe ou non. Il utilise l'opérateur logique NOT ! dans le test de l'instruction if.

#!/bin/bash if [[ ! -d $1 ]] then   echo “Creating backup directory:” $1   mkdir $1   if [[ ! $ ? -eq 0 ]]   then     echo “Impossible de créer le répertoire de sauvegarde :” $1     exit   fi else   echo “Le répertoire de sauvegarde existe.” fi # continue avec la sauvegarde du fichier echo “Sauvegarde jusqu'à : “$1

Si le répertoire n'existe pas, il le crée. Si les fichiers de création de répertoire, le script se termine. Si la création du répertoire réussit ou si le répertoire existe déjà, le script poursuit ses actions de sauvegarde.

Nous allons exécuter le script puis vérifier avec ls et l'option -d (répertoire) si le répertoire de sauvegarde existe.

./script6.sh Documents/project-backup ls -d Documents/project-backup

< /p>

Le répertoire de sauvegarde a été créé. Si nous exécutons à nouveau le script, il devrait signaler que le répertoire est déjà présent.

./script6.sh

Le script trouve le répertoire et continue pour effectuer la sauvegarde.

Testez, ne présumez pas

Tôt ou tard, les suppositions mèneront à de mauvaises choses. Testez d'abord et réagissez en conséquence.

La connaissance, c'est le pouvoir. Utilisez des tests pour donner à vos scripts les connaissances dont ils ont besoin.

CONNEXION : Comment laisser les scripts Linux détecter qu'ils s'exécutent sur des machines virtuelles

LIRE LA SUITE

  • › Test de la tablette Amazon Fire 7 (2022) : faible mais bon marché
  • › 10 excellentes fonctionnalités iPhone que vous devriez utiliser
  • › Pourquoi voulez-vous un Wi-Fi maillé, même si vous n'avez besoin que d'un seul routeur
  • &rsaquo ; Le Samsung Galaxy Z Flip 4 a des mises à niveau internes, pas des modifications de conception
  • › Examen du chargeur UGREEN Nexode 100 W : plus qu'assez de puissance
  • &rsaquo ; 10 nouvelles fonctionnalités de Windows 11 que vous devriez utiliser