GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo verificar si existe un archivo o directorio en Bash

Muchas veces, al escribir scripts de Shell, es posible que se encuentre en una situación en la que necesite realizar una acción en función de si un archivo existe o no.

En Bash, puede usar el comando de prueba para verificar si existe un archivo y determinar el tipo del archivo.

El comando de prueba toma una de las siguientes formas de sintaxis:

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

Si desea que su secuencia de comandos sea portátil, debería preferir usar la prueba anterior [ comando, que está disponible en todos los shells POSIX. La nueva versión mejorada del comando de prueba [[ (corchetes dobles) es compatible con la mayoría de los sistemas modernos que usan Bash, Zsh y Ksh como shell predeterminado.

Verificar si el archivo existe #

Al comprobar si existe un archivo, los operadores de ARCHIVO más utilizados son -e y -f . El primero verificará si existe un archivo independientemente del tipo, mientras que el segundo devolverá verdadero solo si el ARCHIVO es un archivo normal (no un directorio o un dispositivo).

La opción más legible al verificar si un archivo existe o no es usar el test comando en combinación con if declaración. Cualquiera de los fragmentos a continuación verificará si /etc/resolv.conf el archivo existe:

FILE=/etc/resolv.conf
if test -f "$FILE"; then
    echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [[ -f "$FILE" ]]; then
    echo "$FILE exists."
fi

Si desea realizar una acción diferente en función de si el archivo existe o no, simplemente use la construcción si/entonces:

FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE exists."
else 
    echo "$FILE does not exist."
fi
Utilice siempre comillas dobles para evitar problemas al tratar con archivos que contengan espacios en blanco en sus nombres.

También puede usar el comando de prueba sin la instrucción if. El comando después de && El operador solo se ejecutará si el estado de salida del comando de prueba es verdadero,

test -f /etc/resolv.conf && echo "$FILE exists."
[ -f /etc/resolv.conf ] && echo "$FILE exists."
[[ -f /etc/resolv.conf ]] && echo "$FILE exists."

Si desea ejecutar una serie de comandos después de && el operador simplemente encierra los comandos entre corchetes separados por ; o && :

[ -f /etc/resolv.conf ] && { echo "$FILE exist."; cp "$FILE" /tmp/; }

Opuesto a && , la declaración después del || el operador solo se ejecutará si el estado de salida del comando de prueba es false .

[ -f /etc/resolv.conf ] && echo "$FILE exist." || echo "$FILE does not exist."

Verificar si el directorio existe #

Los operadores -d le permite probar si un archivo es un directorio o no.

Por ejemplo, para comprobar si /etc/docker existe un directorio que usaría:

FILE=/etc/docker
if [ -d "$FILE" ]; then
    echo "$FILE is a directory."
fi
[ -d /etc/docker ] && echo "$FILE is a directory."

También puede utilizar los corchetes dobles [[ en lugar de uno solo [ .

Verificar si el archivo no existe #

Al igual que en muchos otros idiomas, la expresión de prueba se puede negar usando el ! (signo de exclamación) operador lógico no:

FILE=/etc/docker
if [ ! -f "$FILE" ]; then
    echo "$FILE does not exist."
fi

Igual que arriba:

[ ! -f /etc/docker ] && echo "$FILE does not exist."

Comprobar si existen varios archivos #

En lugar de usar complicadas construcciones if/else anidadas, puede usar -a (o && con [[ ) para comprobar si existen varios archivos:

if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
    echo "Both files exist."
fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then
    echo "Both files exist."
fi

Variantes equivalentes sin utilizar la sentencia IF:

[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."

Operadores de prueba de archivos #

El comando de prueba incluye los siguientes operadores de ARCHIVO que le permiten probar tipos particulares de archivos:

  • -b FILE - Verdadero si el ARCHIVO existe y es un archivo de bloque especial.
  • -c FILE - Verdadero si el ARCHIVO existe y es un archivo de caracteres especiales.
  • -d FILE - Verdadero si el ARCHIVO existe y es un directorio.
  • -e FILE - Verdadero si el ARCHIVO existe y es un archivo, independientemente del tipo (nodo, directorio, socket, etc.).
  • -f FILE - Verdadero si el ARCHIVO existe y es un archivo normal (no un directorio o dispositivo).
  • -G FILE - Verdadero si el ARCHIVO existe y tiene el mismo grupo que el usuario que ejecuta el comando.
  • -h FILE - Verdadero si el ARCHIVO existe y es un enlace simbólico.
  • -g FILE - Verdadero si el ARCHIVO existe y tiene set-group-id (sgid ) bandera establecida.
  • -k FILE - Verdadero si el ARCHIVO existe y tiene establecido un indicador de bits fijos.
  • -L FILE - Verdadero si el ARCHIVO existe y es un enlace simbólico.
  • -O FILE - Verdadero si el ARCHIVO existe y es propiedad del usuario que ejecuta el comando.
  • -p FILE - Verdadero si el ARCHIVO existe y es una canalización.
  • -r FILE - Verdadero si el ARCHIVO existe y es legible.
  • -S FILE - Verdadero si el ARCHIVO existe y es un socket.
  • -s FILE - Verdadero si el ARCHIVO existe y tiene un tamaño distinto de cero.
  • -u FILE - Verdadero si el ARCHIVO existe y set-user-id (suid ) está establecida.
  • -w FILE - Verdadero si el ARCHIVO existe y se puede escribir.
  • -x FILE - Verdadero si el ARCHIVO existe y es ejecutable.

Conclusión #

En esta guía, le mostramos cómo verificar si un archivo o directorio existe en Bash.

Si tiene alguna pregunta o comentario, no dude en dejar un comentario.


Linux
  1. ¿Cómo verificar el progreso de la ejecución de Cp?

  2. ¿Cómo puedo comprobar que existe un archivo y ejecutar un comando si no es así?

  3. Compruebe si existe un determinado tipo de archivo/extensión en el directorio

  4. ¿Cómo puedo comprobar si existe un directorio?

  5. ¿Cómo ejecutar un script bash?

Ansible:comprobar si existe un archivo

Cómo verificar si existe un archivo o directorio en Bash

Cómo leer archivos línea por línea en Bash

Cómo leer un archivo línea por línea en Bash

¿Cómo verificar la subcadena en Shell Script Bash?

Cómo verificar si existe un archivo o directorio en Bash Shell