web-dev-qa-db-fra.com

Comment vérifier si un fichier existe dans un script shell

J'aimerais écrire un script Shell qui vérifie si un certain fichier, archived_sensor_data.json, existe et, le cas échéant, le supprime. Après http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html , j'ai essayé les solutions suivantes:

[-e archived_sensor_data.json] && rm archived_sensor_data.json

Cependant, cela jette une erreur

[-e: command not found

lorsque j'essaie d'exécuter le script test_controller résultant à l'aide de la commande ./test_controller. Quel est le problème avec le code?

135
Kurt Peek

Il vous manque un espace entre le crochet et -e:

#!/bin/bash
if [ -e x.txt ]
then
    echo "ok"
else
    echo "nok"
fi
292
chris01

Voici une méthode alternative utilisant ls:

(ls x.txt && echo yes) || echo no

Si vous souhaitez masquer une sortie de ls pour que vous ne voyiez que oui ou non, redirigez stdout et stderr vers /dev/null:

(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no
19
Philip Kirkbride

En interne, la commande rm doit quand même vérifier l'existence du fichier,
alors pourquoi ajouter un autre test? Juste émettre

rm filename

et il sera parti après cela, si c'était là ou pas.
Utilisez rm -f si vous ne voulez pas de messages concernant des fichiers inexistants.

Si vous devez agir si le fichier n'existe pas, vous devez le tester vous-même. D'après votre exemple de code, ce n'est pas le cas dans cet exemple.

5
T G

Le fond de ma recommandation de solution est l’histoire d’un ami qui, bien dans la deuxième semaine de son premier emploi, a effacé la moitié d’un serveur de build. La tâche de base consiste donc à déterminer si un fichier existe et, le cas échéant, supprimons-le. Mais il y a quelques rapides dangereux sur cette rivière:

  • Tout est un fichier.

  • Les scripts n'ont de réel pouvoir que s'ils résolvent des tâches générales

  • Pour être général, nous utilisons des variables

  • Nous utilisons souvent -f force dans les scripts pour éviter toute intervention manuelle

  • Et aussi love-r récursif pour nous assurer de créer, copier et détruire en temps voulu.

Considérez le scénario suivant:

Nous avons le fichier que nous voulons supprimer: filesexists.json

Ce nom de fichier est stocké dans une variable

<Host>:~/Documents/thisfolderexists filevariable="filesexists.json"

Nous avons aussi une variable de chemin pour rendre les choses vraiment flexibles

<Host>:~/Documents/thisfolderexists pathtofile=".."

<Host>:~/Documents/thisfolderexists ls $pathtofile

filesexists.json  history20170728  SE-Data-API.pem  thisfolderexists

Voyons donc si -e fait ce qu'il est censé faire. Les fichiers existent-ils?

<Host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

Cela fait. La magie.

Cependant, que se passerait-il si la variable de fichier avait été évaluée accidentellement à nuffin '

<Host>:~/Documents/thisfolderexists filevariable=""

<Host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

Quelle? Il est censé revenir avec une erreur ... Et c'est le début de l'histoire comment tout ce dossier a été supprimé par accident

Une alternative pourrait être de tester spécifiquement ce que nous comprenons être un "fichier"

<Host>:~/Documents/thisfolderexists filevariable="filesexists.json"

<Host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

0

Donc, le fichier existe ...

<Host>:~/Documents/thisfolderexists filevariable=""

<Host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

1

Donc, ce n'est pas un fichier et peut-être que nous ne voulons pas supprimer tout ce répertoire

man test dit ce qui suit:

-b FILE

       FILE exists and is block special

-c FILE

       FILE exists and is character special

-d FILE

       FILE exists and is a directory

-e FILE

       FILE exists

-f FILE

       FILE exists and is a regular file

...

-h FILE

       FILE exists and is a symbolic link (same as -L)
4
Lefty G Balogh