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.

6voto

Rogue Points 508

Ce script shell fonctionne également pour trouver un fichier dans un répertoire :

echo "enter file"

read -r a

if [ -s /home/trainee02/"$a" ]
then
    echo "yes. file is there."
else
    echo "sorry. file is not there."
fi

3 votes

Il n'est pas évident que cela apporte quelque chose que les autres réponses n'ont pas déjà donné. Elle code en dur un nom de chemin. Puisque la question est balisée bash il pourrait utiliser read -p "Enter file name: " -r a pour inciter à la lecture et à l'écriture. Il utilise des guillemets autour de la variable ; c'est bien, mais cela devrait être expliqué. Ce serait mieux s'il faisait écho au nom du fichier. Et ceci vérifie que le fichier existe et n'est pas vide (c'est la signification de -s ) alors que la question porte sur n'importe quel fichier, vide ou non (pour lequel -f est plus approprié).

6voto

André Points 833

Il peut parfois être utile d'utiliser les opérateurs && et ||.

Comme dans (si vous avez la commande "test") :

test -b $FILE && echo File not there!

o

test -b $FILE || echo File there!

4voto

Mauro Zallocco Points 56

Si vous voulez utiliser test au lieu de [] alors vous pouvez utiliser ! pour obtenir la négation :

if ! test "$FILE"; then
  echo "does not exist"
fi

0 votes

Merci. Je faisais défiler des pages sans fin en cherchant/espérant que quelqu'un fournisse cette version :-)

2voto

upteryx Points 41

Vous pouvez également regrouper plusieurs commandes dans un seul et même fichier.

[ -f "filename" ] || ( echo test1 && echo test2 && echo test3 )

o

[ -f "filename" ] || { echo test1 && echo test2 && echo test3 ;}

Si le nom de fichier ne sort pas, la sortie sera

test1
test2
test3

Remarque : ( ... ) s'exécute dans un sous-shell, { ... ;} s'exécute dans le même shell. La notation des crochets fonctionne uniquement en bash.

2 votes

Non, la notation entre crochets est no bash-only ; il fonctionne dans tout shell compatible POSIX.

1 votes

La partie la plus intéressante de votre réponse est d'expliquer la différence entre (...) y {...} ! Je n'en avais aucune idée ! J'apprends tous les jours... merci !

0voto

jonretting Points 114

Une fonction propre pour ce genre de choses est la meilleure, j'ai créé un exemple redondant ici... http://stackoverflow.com/a/20463366/2083509

check-file(){
    while [[ ${#} -gt 0 ]]; do
        case $1 in
           fxrsw) [[ -f "$2" && -x "$2" && -r "$2" && -s "$2" && -w "$2" ]] || return 1 ;;
            fxrs) [[ -f "$2" && -x "$2" && -r "$2" && -s "$2" ]] || return 1 ;;
             fxr) [[ -f "$2" && -x "$2" && -r "$2" ]] || return 1 ;;
              fr) [[ -f "$2" && -r "$2" ]] || return 1 ;;
              fx) [[ -f "$2" && -x "$2" ]] || return 1 ;;
              fe) [[ -f "$2" && -e "$2" ]] || return 1 ;;
              hf) [[ -h "$2" && -f "$2" ]] || return 1 ;;
               *) [[ -e "$1" ]] || return 1 ;;
        esac
        shift
    done
    return 0
}

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