Me gustaría escribir un script de shell que verifique si un determinado archivo archived_sensor_data.json
existe y, de ser así, lo elimina. Siguiendo http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html , he intentado lo siguiente:
[-e archived_sensor_data.json] && rm archived_sensor_data.json
Sin embargo, esto arroja un error
[-e: command not found
cuando trato de ejecutar el test_controller
script resultante usando el ./test_controller
comando ¿Qué tiene de malo el código?
Respuestas:
Te falta un espacio requerido entre el soporte y
-e
:fuente
[ -e archived_sensor_data.json ] && rm archived_sensor_data.json
. El guión parece funcionar ahora.if [ -e "$1" ]
(argumento de entrada de nombre de archivo).Aquí hay un método alternativo que usa
ls
:Si desea ocultar cualquier salida de
ls
modo que solo vea sí o no, redirijastdout
ystderr
a/dev/null
:fuente
ls
tiene éxito, existe dicho archivo, de lo contrario, no hay ninguno". Sils
falla, no significa que falta el archivo. Podría ser algún otro error. Por ejemplo, cree un archivo en el directorio propiedad de root e intente hacerlols
con un usuario normal. FallaráPermission denied
, lo que no es equivalente a que el archivo no exista.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
También tenemos una variable de ruta para hacer las cosas realmente flexibles
Entonces, veamos si
-e
hace lo que se supone que debe hacer. ¿Existen los archivos?Lo hace. Magia.
Sin embargo, qué sucedería si la variable del archivo se evaluara accidentalmente como nuffin '
¿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'
Entonces el archivo existe ...
Así que este no es un archivo y tal vez, no queremos eliminar todo ese directorio
man test
tiene lo siguiente que decir:fuente
Internamente, el comando rm debe probar la existencia del archivo de todos modos,
entonces , ¿por qué agregar otra prueba? Solo emitir
y desaparecerá después de eso, ya sea que esté allí o no.
Use rm -f si no desea ningún mensaje sobre archivos inexistentes.
Si necesita tomar alguna medida si el archivo NO existe, debe probarlo usted mismo. Según su código de ejemplo, este no es el caso en esta instancia.
fuente
Si está utilizando un NFS, "prueba" es una mejor solución, porque puede agregarle un tiempo de espera, en caso de que su NFS esté inactivo:
Una construcción "[-e my_file]" se congelará hasta que el NFS vuelva a funcionar:
fuente
test
y[
son sinónimos También puede usartimeout
con[
, ytest
también se congela si NFS se bloquea.