Comment utiliser la commande rename sur Linux
Agence web » Actualités du digital » Comment vérifier si un fichier existe dans les scripts Linux Bash

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

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 pouvez 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 d’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 intégrer dans des scripts est facile, mais les avantages en termes de robustesse et de contrôle fin sont considérables.

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 un caractère spécial.
  • -ré: 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 true si le fichier a le setgid ensemble d’autorisations (chmod g+).
  • -h: Renvoie true si le fichier est un lien symbolique.
  • -L: Renvoie vrai si le fichier est un lien symbolique.
  • -k: Renvoie true si son sticky bit est défini (chmod +t).
  • -p: Renvoie true si le fichier est un tube nommé.
  • -r: Renvoie true si le fichier est lisible.
  • -s: Renvoie true si les fichiers existent 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 a le setuid ensemble d’autorisations (chmod u+).
  • -w: Renvoie vrai si le fichier est accessible en écriture.
  • -X: Renvoie true si le fichier est exécutable.
  • -O: Renvoie vrai si le vous appartient.
  • -G: Renvoie true 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 parce que le -a test a été déprécié et remplacé par le -e test.

Utilisation des tests dans les scripts

Le test du fichier générique if instruction est une construction de script simple. La comparaison à l’intérieur des doubles parenthèses » [[ ]] » utilise le -f test 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 "The file $1 exists." 

else 

  echo "The file $1 cannot be found." 

fi

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

chmod +x script1.sh

Rendre un script exécutable avec chmod

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

Essayons le script sur un simple fichier texte.

./script1.sh test-file.txt

Exécution de script1.sh sur un fichier normal

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

Exécution de script1.sh sur un fichier qui n'existe pas

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 sachant si le fichier est présent ou non.

La -f flag teste si le fichier est présent et s’il s’agit d’un fichier « normal ». 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 fichier « /dev/random » existe, puis nous verrons ce que le script en fera.

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

Exécution de script1.sh sur un fichier de périphérique

Étant donné que notre script teste les fichiers normaux et que « /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.

Il s’agit de « script2.sh », qui teste les fichiers normaux et les fichiers de périphérique de caractères.

#!/bin/bash

if [[ -f $1 ]]
then
  echo "The file $1 exists."
else
  echo "The file $1 is missing or not a regular file."
fi

if [[ -c $1 ]]
then
  echo "The file $1 is a character device file."
else
  echo "The file $1 is missing or not a special file." 
fi

Si nous exécutons ce script sur le fichier de périphérique « /dev/random », le premier test échoue, ce que nous attendons, et le second test réussit. Il reconnaît le fichier en tant que fichier de périphérique.

./script2.sh /dev/random

Exécution de script2.sh sur un fichier de périphérique de caractères

En fait, il le reconnaît comme un personnage fichier de l’appareil. Certains fichiers de périphérique sont des fichiers de périphérique de bloc. Dans l’état actuel des choses, notre script ne s’en occupera pas.

./script2.sh /dev/sda

Exécution de scrip2.sh sur un fichier de périphérique de bloc

Nous pouvons utiliser la logique OR opérateur et inclure un autre test dans la seconde instruction if. Cette fois, si le fichier est un fichier de périphérique de caractères ou un fichier de périphérique bloc, le test renverra vrai. Il s’agit de « script3.sh ».

#!/bin/bash

if [[ -f $1 ]]
then
  echo "The file $1 exists."
else
  echo "The file $1 is missing or not a regular file."
fi

if [[ -c $1 || -b $1 ]]
then
  echo "The file $1 is a character or block device file."
else
  echo "The file $1 is missing or not a special file." 
fi

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

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

script3.sh gère correctement les fichiers de périphériques de caractères et de blocs

S’il est important pour vous de différencier les différents types de fichiers de périphérique, vous pouvez utiliser if déclarations. Il s’agit de « script4.sh ».

#!/bin/bash

if [[ -f $1 ]]
then
  echo "The file $1 exists."
else
  echo "The file $1 is missing or not a regular file."
fi

if [[ -c $1 ]]
then
  echo "The file $1 is a character device file."
else
  if [[ -b $1 ]]
  then
    echo "The file $1 is a block device file." 
  else
    echo "The file $1 is missing or not a device file."
  fi
fi

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

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

script8.sh identifiant correctement les fichiers de périphérique de caractère et de bloc

En utilisant l’opérateur logique ET, nous pouvons tester plusieurs caractéristiques à la fois. Il s’agit de « script5.sh ». Il vérifie qu’un fichier existe et le script a lu et écrire des autorisations pour cela.

#!/bin/bash

if [[ -f $1 && -r $1 && -w $1 ]]
then
  echo "The file $1 exists and we have read/write permissions."
else
  echo "The file $1 is missing, not a regular file, or we can't read/write to it."
fi

Nous exécuterons le script sur un fichier qui nous appartient, et un qui appartient à root.

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

script5.sh vérifiant si un fichier existe et si les autorisations de lecture et d'écriture sont définies

Pour tester l’existence d’un répertoire, utilisez la -d test. Il s’agit de « 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 la logique NOT opérateur ! dans le if essai de déclaration.

#!/bin/bash

if [[ ! -d $1 ]]
then
  echo "Creating backup directory:" $1
  mkdir $1

  if [[ ! $? -eq 0 ]]
  then
    echo "Couldn't create backup directory:" $1
    exit
  fi
else
  echo "Backup directory exists."
fi

# continue with file backup
echo "Backing up to: "$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 le -d (répertoire) indique si le répertoire de sauvegarde existe.

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

script6.sh détectant si un répertoire existe

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

script6.sh réutilisant un répertoire existant

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

Testez, ne présumez pas

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

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

★★★★★