Comment vérifier correctement si le fichier existe dans Bash ou Shell (avec des exemples)
Table des matières
Dans ce tutoriel, je couvrirai différents attributs que vous pouvez utiliser dans les scripts bash ou shell pour vérifier les fichiers et répertoires. Vous pouvez utiliser des expressions conditionnelles bash avec ]
ou utiliser test avec pour vérifier si le fichier existe.
Nous allons utiliser l’opérateur bash if et else pour tous les exemples, je vous recommande donc de lire: Bash if else guide d’utilisation pour les débutants absolus
1. Bash / Shell: vérifier si le fichier existe et est un fichier régulier
Cette section montre les exemples pour vérifier si un fichier régulier existe dans bash.
1.1: Méthode-1: Utiliser des crochets simples ou doubles
Utiliser des crochets doubles ]
#!/bin/bashFILE="/etc/passwd"if ];then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
Utilisation de crochets simples
#!/bin/bashFILE="/etc/passwd"if ;then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
1.2: Méthode 2: Utilisation de la commande de test
test
La commande est utilisée pour vérifier les types de fichiers et comparer valeurs.
#!/bin/bashFILE="/etc/passwd"if test -f $FILE; then echo "$FILE exists"else echo "$FILE missing"fi
1.3: Méthode 3: Une seule ligne
Nous pouvons utiliser des crochets simples ou doubles ici dans cet exemple. Je recommanderais de toujours utiliser des doubles crochets lorsque vous écrivez un code de ligne dans le shell car cela minimise le risque de recevoir des avertissements sur la console lors du fractionnement de mots.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists" || echo "$FILE missing"
L’instruction après &&
sera exécutée si SUCCESS. Si la première condition renvoie FALSE, alors l’instruction avec ||
sera exécutée.
De même, en utilisant la commande de test pour vérifier si un fichier normal existe dans bash ou un script shell sur une seule ligne .
#!/bin/bashFILE="/etc/passwd"test -f $FILE && echo "$FILE exists" || echo "$FILE missing"
2. Bash / Shell: Vérifiez si le fichier existe (est vide ou pas vide)
Pour vérifier si le fichier existe et s’il est vide ou s’il contient du contenu, nous utilisons l’attribut « -s
»
2.1: Méthode 1: Utilisation de crochets simples ou doubles
Vérifiez si le fichier existe et vide ou pas vide en utilisant des doubles crochets ]
#!/bin/bashFILE="/etc/passwd"if ]; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
Vérifiez si le fichier existe et vide ou pas vide en utilisant des crochets doubles
if ; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
2.2: Méthode 2: Utilisation de la commande de test
En utilisant la commande de test, nous combinons l’attribut -s
pour vérifier si le fichier existe et est vide ou contient du contenu:
2.3: Méthode 3: Ligne unique
Nous pouvons utiliser des crochets doubles ou simples pour une telle doublure, mais comme je l’ai dit plus tôt, je recommanderais d’utiliser des crochets doubles.
#!/bin/bashFILE="/etc/passwd"test -s $FILE && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
De même avec la commande de test, nous pouvons utiliser &&
et ||
opérateur pour vérifier le fichier en une seule ligne de commande dans notre script shell.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
3. Bash / Shell: vérifier si le répertoire existe
J’espère que vous savez que sous Linux, tout est un fichier. Ainsi, de cette manière, un répertoire est également considéré comme un fichier. Nous pouvons utiliser l’attribut « -d
» pour vérifier si un répertoire existe en programmation shell.
3.1: Méthode-1: Utilisation de crochets doubles ou simples
Nous pouvons utiliser l’attribut -d
dans un seul ou des doubles crochets
]
pour vérifier si le répertoire existe.
#!/bin/bashDIR="/var/log"if ]; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
De même, nous utilisons des crochets simples dans cet exemple pour vérifier si le répertoire est prédéfini dans le script shell.
#!/bin/bashDIR="/var/log"if ; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.2: Méthode 2: Utilisation de la commande de test
Dans cet exemple, nous utiliserons la commande de test pour nous assurer que le répertoire est présent ou non avant d’effectuer certaines tâches.
#!/bin/bashDIR="/var/log"if test -d $DIR; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.3: Méthode 3: Une seule ligne
Dans cet exemple, nous utiliserons des crochets simples et doubles sous forme d’une seule ligne pour vérifier pour l’annuaire. L’instruction après l’opérateur &&
sera exécutée si la première condition est TRUE et si elle est FALSE l’instruction de ||
condition « sera exécutée .
#!/bin/bashDIR="/var/log"] && echo "$DIR exists" || echo "$DIR doesn"t exist"
Je recommanderais d’utiliser ]
au lieu de pour un tel code de ligne dans la programmation shell.
De même avec &&
et ||
nous pouvons utiliser la commande de test pour vérifier si le répertoire existe
#!/bin/bashDIR="/var/log"test -d $DIR && echo "$DIR exists" || echo "$DIR doesn"t exist"
4. Bash / Shell: Vérifie si le répertoire existe (vide ou pas vide)
Il n’y a pas d’attribut shell comme je l’ai utilisé dans tous les autres exemples et scénarios de ce tutoriel. Mais nous avons quelques hacks que nous pouvons utiliser pour vérifier si le répertoire est vide ou non vide.
4.1: Méthode-1: Lister le contenu du répertoire et vérifier
Dans cet exemple, nous allons lister le contenu du répertoire, supprimer la sortie puis en fonction du code de sortie vérifier si le répertoire est vide ou en contient content
#!/bin/bashDIR="/tmp"if ls -1qA $DIR | grep -q . ; then echo "$DIR is not -empty"else echo "$DIR is empty"fi
Nous pouvons également inverser cela en mettant une condition NOT (!
). Cela ressemblerait donc à:
#!/bin/bashDIR="/tmp"if ! ls -1qA $DIR | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
La sortie serait la même dans les deux exemples de scripts.
4.2: Méthode 2: Utilisation Commande find
Nous pouvons utiliser la commande find puis supprimer la sortie pour vérifier si le répertoire cible a du contenu ou non.
#!/bin/bashDIR="/tmp"if find -- "$DIR" -prune -type d -empty | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
4.3: Méthode 3: Lister le contenu
Encore une fois comme je l’ai dit puisqu’il n’y a pas de moyen facile de vérifier si un répertoire est vide ou n’utilise pas certains attributs, nous allons lister le contenu du répertoire. Si vous n’obtenez aucune sortie, le répertoire est vide ou pas vide
#!/bin/bashDIR="/tmp"if ] ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
5. Bash / Shell: Liste des attributs à tester le fichier
De même, il existe de nombreux autres attributs que vous pouvez utiliser avec des scripts shell pour vérifier différents types de fichiers, tels que des liens symboliques, des autorisations de fichiers, etc.
Attributs | Que fait-il? |
---|---|
-a FILE |
Vrai si FILE existe |
-b FILE |
Vrai si FILE existe et est un fichier spécial de bloc. |
-c FILE |
Vrai si FILE existe et est un fichier spécial de caractères. |
-d FILE |
Vrai si FILE existe et est un répertoire. |
Vrai si FILE existe |
|
-f FILE |
Vrai si FILE existe et est un fichier normal |
-g FILE |
Vrai si FILE existe et que son bit set-group-id est défini |
-h FILE |
Vrai si FILE existe et est un lien symbolique |
-k FILE |
Vrai si FILE existe et que son bit « sticky » est défini |
-p FILE |
Vrai si FILE existe et est un tube nommé (FIFO) |
-r FILE |
Vrai si FILE existe et est lisible |
-s FILE |
Vrai si FILE existe et a une taille supérieure à zéro |
-u FILE |
Vrai si FILE existe et que son bit set-user-id est défini |
-w FILE |
Vrai si FILE existe et est accessible en écriture |
-x FILE |
Vrai si FILE existe et est exécutable |
-G FILE |
Vrai si FILE existe et appartient à l’ID de groupe effectif |
-L FILE |
Vrai si FILE existe et est un lien symbolique |
-N FILE |
Vrai si FILE existe et a été modifié depuis sa dernière lecture |
-o FILE |
Vrai si FILE existe et appartient à l’effectif ID utilisateur |
-S FILE |
Vrai si FILE existe et est une socket |
|
Vrai si FILE1 et FILE2 font référence au même appareil et numéros d’inode |
FILE1 -nt FILE2 |
Vrai si FILE1 est plus récent (selon la date de modification) que FILE2 , ou si FILE1 existe et FILE2 pas |
FILE1 -ot FILE2 |
Vrai si FILE1 est plus ancien que FILE2 , ou si FILE2 existe et FILE1 |