Saltar al contenido

Cómo comprobar si existe un archivo en un script de shell

Solución:

Falta un espacio requerido entre el soporte y -e:

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

Aquí hay un método alternativo que usa ls:

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

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

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

El trasfondo de mi recomendación de solución es la historia de un amigo que, hasta 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 si es así, eliminémoslo. 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 generales, usamos 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

Así que 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é pasaría si la variable de archivo se evaluara accidentalmente para nuffin ‘

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

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

0

¿Qué? Se supone que regresa 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 que es 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

Entonces, esto no es un archivo y tal vez, no queremos eliminar ese directorio completo

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)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *