La toile de fond de ma recommandation de solution est l'histoire d'un ami qui, bien dans la deuxième semaine de son premier emploi, a nettoyé la moitié d'un serveur de construction. Donc la tâche de base est de déterminer si un fichier existe, et si oui, de le supprimer. Mais il y a quelques rapides traîtres sur cette rivière :
-
Tout est un fichier.
-
Les scripts n'ont un 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 une intervention manuelle
-
J'aime aussi -r recursive pour m'assurer que nous créons, copions et détruisons en temps voulu.
Considérons 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 disposons également d'une variable de chemin pour rendre les choses plus flexibles.
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
Alors voyons si -e
fait ce qu'il est censé faire. Les fichiers existent-ils ?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
C'est le cas. La magie.
Cependant, que se passerait-il si la variable "fichier" était accidentellement évaluée à "rien" ?
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Quoi ? C'est censé revenir avec une erreur... Et c'est le début de l'histoire de comment ce dossier entier dossier a été supprimé par accident
Une alternative pourrait être de tester spécifiquement ce que nous comprenons comme étant 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, nous ne voulons pas supprimer ce répertoire entier.
man test
a déclaré 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)
5 votes
Duplicata possible de Comment savoir si un fichier régulier n'existe pas dans Bash ?
7 votes
Vous devez définir un ou plusieurs espaces entre le crochet ouvrant "[" et l'option "-e", de même qu'entre le nom du fichier et le crochet fermant "]".
2 votes
En rapport : Pourquoi avons-nous besoin d'un espace autour des crochets dans Bash si .