3586 votes

Comment savoir si un fichier régulier n'existe pas dans Bash ?

J'ai utilisé le script suivant pour voir si un fichier existe :

#!/bin/bash

FILE=$1     
if [ -f $FILE ]; then
   echo "File $FILE exists."
else
   echo "File $FILE does not exist."
fi

Quelle est la syntaxe correcte à utiliser si je veux seulement vérifier si le fichier fait no existent ?

#!/bin/bash

FILE=$1     
if [ $FILE does not exist ]; then
   echo "File $FILE does not exist."
fi

209 votes

J'ai trouvé ceci liste des instructions conditionnelles de bash très utile.

11 votes

Étant la personne très paresseuse que je suis, j'aurais typiquement utilisé la construction de contournement stupide suivante : if [ -f $FILE ]; then; else; echo "File $FILE does not exist."; fi; C'est probablement une bonne chose que j'aie trouvé cette question à la place et que j'aie appris à le faire d'une manière plus correcte :)

6 votes

Pour être pendulaire, vous devriez dire "fichier ordinaire", car la plupart des documents UNIX/POSIX font référence de manière générique à tous les types d'entrées du système de fichiers par le simple terme "fichiers", par exemple, un lien symbolique est un type de fichier, tout comme un tuyau nommé, un fichier ordinaire, un répertoire, un bloc spécial, un caractère spécial, une socket, etc.

4930voto

John Feminella Points 116878

El test ( [ ici) possède un opérateur logique "pas" qui est le point d'exclamation (similaire à de nombreuses autres langues). Essayez ceci :

if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi

240 votes

Plus succinctement : [ ! -f /tmp/foo.txt ] && echo "Fichier non trouvé !"

40 votes

J'ai lutté un peu pour trouver la bonne syntaxe pour "if any of 2 files does not exist". Les deux suivantes fonctionnent : if [ ! \( -f "f1" -a -f "f2" \) ] ; then echo MISSING; fi if [ ! -f "f1" ] || [ ! -f "f2" ] ; then echo MISSING; fi

166 votes

@DavidWinterbottom Encore plus succulent : [ -f /tmp/foo.txt ] || echo "File not found!"

768voto

GroundZero Points 678

Test des fichiers Bash

-b filename - Bloquer le fichier spécial
-c filename - Fichier de caractères spéciaux
-d directoryname - Vérifier l'existence du répertoire
-e filename - Vérifier l'existence des fichiers, quel que soit leur type (nœud, répertoire, socket, etc.)
-f filename - Vérifier l'existence d'un fichier régulier et non d'un répertoire
-G filename - Vérifier si le fichier existe et s'il appartient au groupe effectif ID
-G filename set-group-id - Vrai si le fichier existe et est set-group-id
-k filename - Morceau collant
-L filename - Lien symbolique
-O filename - Vrai si le fichier existe et est possédé par l'utilisateur effectif.
-r filename - Vérifier si le fichier est lisible
-S filename - Vérifier si le fichier est un socket
-s filename - Vérifier si le fichier a une taille non nulle
-u filename - Vérifier si le bit set-user-id du fichier est activé.
-w filename - Vérifier si le fichier est accessible en écriture
-x filename - Vérifier si le fichier est exécutable

Comment l'utiliser :

#!/bin/bash
file=./file
if [ -e "$file" ]; then
    echo "File exists"
else 
    echo "File does not exist"
fi 

A expression de test peuvent être niées en utilisant l'option ! opérateur

#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
    echo "File does not exist"
else 
    echo "File exists"
fi

1 votes

@0x90 Si vous le souhaitez, vous êtes libre de modifier mon message et de l'ajouter à la liste. Je suppose que vous voulez dire : -n String - Vérifie si la longueur de la chaîne n'est pas nulle. Ou bien voulez-vous dire file1 -nt file2 - Vérifier si le fichier 1 est plus récent que le fichier 2 (vous pouvez aussi utiliser -ot pour plus vieux que).

1 votes

A propos de -n : The unary operator -z tests for a null string, while -n or no operator at all returns True if a string is not empty. ~ ibm.com/developerworks/library/l-bash-test/index.html

1 votes

Pourquoi n'a-t-on pas ajouté une fonction comme la fonction exists() { if [ -e "$1" ] ; then echo "$1 exists" else echo "$1 does not exist" fi }

302voto

Vous pouvez annuler une expression avec " !":

#!/bin/bash
FILE=$1

if [ ! -f "$FILE" ]
then
    echo "File $FILE does not exist"
fi

La page de manuel correspondante est man test ou, de manière équivalente, man [ -- ou help test o help [ pour la commande bash intégrée.

4 votes

En bash , [ est un buildin. L'information pertinente est donc plutôt obtenue par help [ ... mais cela montre que [ est un synonyme de la test intégré, donc l'information pertinente est plutôt obtenue par help test . Voir aussi le Section Expression conditionnelle de Bash dans le manuel .

0 votes

@gniourf_gniourf : Oui, mais le bash intégré [ se comporte de manière très similaire à la commande externe [ donc soit man test o man [ vous donnera une bonne idée de son fonctionnement.

10 votes

@KeithThompson sauf que le bash intégré [ a plus de commutateurs que la commande externe [ trouvé sur mon système... D'une manière générale, je pense qu'il est préférable de lire la documentation spécifique à un outil donné, et non la documentation spécifique à un autre outil vaguement apparenté. Mais je peux me tromper ;)

144voto

guns Points 3881
[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"

Il est également possible que le fichier soit un lien symbolique brisé, ou un fichier non régulier, comme par exemple une socket, un device ou un fifo. Par exemple, pour ajouter une vérification des liens symboliques cassés :

if [[ ! -f $FILE ]]; then
    if [[ -L $FILE ]]; then
        printf '%s is a broken symlink!\n' "$FILE"
    else
        printf '%s does not exist!\n' "$FILE"
    fi
fi

10 votes

Puis-je demander pourquoi les deux "["s dans le test ? (par exemple [[ ! -a $FILE ]]). J'ai essayé toutes les options mentionnées sur une machine Solaris et seule celle-là a fonctionné, alors merci, mais pourquoi ?

32 votes

Les doubles crochets sont une extension "moderne" ; par exemple, ils ne séparent pas les mots (comme pour les noms de fichiers contenant des espaces) et fonctionnent toujours pour les chaînes de caractères vides : mywiki.wooledge.org/BashFAQ/031

7 votes

En fonction de tldp.org/LDP/abs/html/fto.html L'effet de -a est identique à celui de -e. Il a été "déprécié", et son utilisation est déconseillée. Quoi qu'il en soit, +1 pour la mention de la vérification des liens symboliques brisés.

108voto

Elazar Leibovich Points 9396

Il est utile de mentionner que si vous avez besoin d'exécuter une seule commande, vous pouvez abréger

if [ ! -f "$file" ]; then
    echo "$file"
fi

à

test -f "$file" || echo "$file"

o

[ -f "$file" ] || echo "$file"

0 votes

Merci ! J'ai besoin d'une alternative qui n'utilise pas [[ ]].

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X