verificar scripts script resueltos programas programacion pasar parametros existencia existe ejercicios ejemplos archivo shell

scripts - verificar existencia de archivo en shell



Cómo verificar si existe un archivo en un script de shell (5)

Aquí hay un método alternativo usando ls :

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

Si desea ocultar cualquier salida de ls para que solo vea sí o no, redirija stdout y stderr a /dev/null :

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

Me gustaría escribir un script de shell que verifique si existe un determinado archivo, archived_sensor_data.json , y si es 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 intento ejecutar el script test_controller resultante usando el comando ./test_controller . ¿Qué tiene de malo el código?


El telón de fondo de mi recomendación de solución es la historia de un amigo que, en la segunda semana de su primer trabajo, limpió la mitad de un servidor de compilación. Entonces, la tarea básica es determinar 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 para 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

Por lo tanto, 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)


Internamente, el comando rm debe probar la existencia del archivo de todos modos,
Entonces, ¿por qué agregar otra prueba? Solo emitir

rm filename

y desaparecerá después de eso, tanto si estaba allí como si 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.


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:

time timeout 3 test -f /nfs/my_nfs_is_currently_down real 0m3.004s <<== timeout is taken into account user 0m0.001s sys 0m0.004s echo $? 124 <= 124 means the timeout has been reached

Una construcción "[-e my_file]" se congelará hasta que el NFS vuelva a funcionar:

if [ -e /nfs/my_nfs_is_currently_down ]; then echo "ok" else echo "ko" ; fi <no answer from the system, my session is "frozen">


Te falta un espacio requerido entre el soporte y -e :

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