El telón de fondo de mi recomendación de solución es la historia de un amigo que, bien entrada la segunda semana de su primer trabajo, limpió la mitad de un servidor de compilación. Entonces, la tarea básica es averiguar si existe un archivo y, de ser así, eliminarlo. Pero hay algunos rápidos traicioneros en este río:
Todo es un archivo
Los scripts tienen poder real solo si resuelven tareas generales
Para ser general, utilizamos variables
A menudo usamos -f force en los scripts para evitar la intervención manual.
Y también love -r recursive para asegurarnos de que creamos, copiamos y destruimos de manera oportuna.
Considere el siguiente escenario:
Tenemos el archivo que queremos eliminar: filesexists.json
Este nombre de archivo se almacena en una variable
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
También tenemos una variable de ruta para hacer las cosas realmente flexibles
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
Entonces, veamos si -e
hace lo que se supone que debe hacer. ¿Existen los archivos?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Lo hace. Magia.
Sin embargo, qué sucedería si la variable del archivo se evaluara accidentalmente como nuffin '
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
¿Qué? Se supone que debe regresar con un error ... Y este es el comienzo de la historia de cómo esa carpeta completa se eliminó por accidente
Una alternativa podría ser probar específicamente lo que entendemos como un 'archivo'
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
Entonces el archivo existe ...
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
Así que este no es un archivo y tal vez, no queremos eliminar todo ese directorio
man test
tiene lo siguiente que decir:
-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)