Cómo verificar si existe un archivo en Linux Bash Scripts

Si un script de Linux Bash se basa en la presencia de ciertos archivos o directorios, no puede simplemente asumir que sí. Necesita comprobar que están definitivamente presentes. Así es como se hace.

No asumas nada

Cuando está escribiendo un guión, no puede hacer suposiciones sobre lo que está y lo que no está presente en una computadora. Eso es doblemente cierto si el script se va a distribuir y ejecutar en muchas computadoras diferentes. Tarde o temprano, la secuencia de comandos se ejecutará en una computadora que no cumpla con sus suposiciones y la secuencia de comandos fallará o se ejecutará de manera impredecible.

Todo lo que valoramos o creamos en una computadora se almacena en un archivo de algún formato, y todos esos archivos residen en un directorio. Los scripts pueden leer, escribir, cambiar el nombre, eliminar y mover archivos y directorios, todo lo que puede hacer en la línea de comandos.

La ventaja que tiene como ser humano es que puede ver el contenido de un directorio y saber si existe un archivo o no, o incluso si existe el directorio esperado. Si un script falla cuando manipula archivos, puede tener resultados graves y dañinos.

Bash proporciona un conjunto integral de pruebas que puede usar para detectar archivos y directorios, y probar muchos de sus atributos. Es fácil incorporarlos en los scripts, pero los beneficios en términos de solidez y control preciso son considerables.

Cómo usar pruebas condicionales de doble corchete en Linux

La gama de pruebas

Al combinar la declaración if con la prueba adecuada de una gran colección de pruebas de archivos y directorios, podemos determinar fácilmente si existe un archivo, si es ejecutable o escribible, y mucho más.

  • -b : Devuelve verdadero si el archivo es un archivo especial de bloque.
  • -C : Devuelve verdadero si el archivo es un carácter especial.
  • -d : Devuelve verdadero si el “archivo” es un directorio.
  • -mi : Devuelve verdadero si el archivo existe.
  • -F : Devuelve verdadero si el archivo existe y es un archivo normal.
  • -gramo : Devuelve verdadero si el archivo tiene el setgid conjunto de permisos ( chmod g+ ).
  • -h : Devuelve verdadero si el archivo es un enlace simbólico.
  • -L : Devuelve verdadero si el archivo es un enlace simbólico.
  • -k : Devuelve verdadero si tiene establecido su sticky bit ( chmod +t ).
  • -pags : Devuelve verdadero si el archivo es una canalización con nombre.
  • -r : Devuelve verdadero si el archivo es legible.
  • -s : Devuelve verdadero si los archivos existen y no están vacíos.
  • -S : Devuelve verdadero si el archivo es un socket.
  • -t : Devuelve verdadero si el descriptor de archivo se abre en una terminal.
  • -tu : Devuelve verdadero si el archivo tiene el setuid conjunto de permisos ( chmod u+ ).
  • -w : Devuelve verdadero si se puede escribir en el archivo.
  • -X : Devuelve verdadero si el archivo es ejecutable.
  • -O : Devuelve verdadero si es de su propiedad.
  • -GRAMO : Devuelve verdadero si pertenece a su grupo.
  • -NORTE : Devuelve verdadero si el archivo ha sido modificado desde la última vez que se leyó.
  • ! : El operador lógico NOT.
  • && : El operador lógico AND.
  • || : El operador lógico OR.

La lista comienza con -b porque el -a La prueba ha quedado obsoleta y reemplazada por la -e prueba.

Cómo usar SUID, SGID y Sticky Bits en Linux

Uso de las pruebas en scripts

La prueba del archivo genérico if declaración es una construcción de secuencias de comandos simple. La comparación dentro de los corchetes dobles” [[ ]] ” utiliza el -f prueba para determinar si existe un archivo regular con ese nombre.

Copie el texto de este script en un editor y guárdelo en un archivo llamado “script1.sh”, y use chmod para hacerlo ejecutable.

                      #!/bin/bash

if [[ -f $1 ]] 

then 

  echo "The file $1 exists." 

else 

  echo "The file $1 cannot be found." 

fi
                    

Tienes que pasar el nombre del archivo al script en la línea de comando.

                      chmod +x script1.sh
                    

Deberá hacer esto con cada secuencia de comandos si desea probar los otros ejemplos del artículo.

Probemos el script en un archivo de texto sencillo.

                      ./script1.sh test-file.txt
                    

Ejecutando script1.sh en un archivo normal

El archivo existe y el script informa correctamente ese hecho. Si eliminamos el archivo y lo intentamos de nuevo, la prueba fallará y el script nos lo informará.

                      ./script1.sh test-file.txt
                    

Ejecutando script1.sh contra un archivo que no existe

En una situación de la vida real, su script necesitaría tomar cualquier acción que fuera apropiada. Quizás marca el error y se detiene. Tal vez crea el archivo y continúa. Puede copiar algo de un directorio de copia de seguridad para reemplazar el archivo que falta. Todo depende del propósito del guión. Pero al menos ahora el script puede tomar la decisión basándose en saber si el archivo está presente o no.

los -f flag comprueba si el archivo está presente y si es un archivo “regular”. En otras palabras, no es algo que parece ser un archivo pero no lo es, como un archivo de dispositivo.

Usaremos ls para verificar que el archivo “/dev/random” existe, y luego veremos qué hace el script con él.

                      ls -lh /dev/random
                    
                      ./script /dev/random
                    

Ejecutar script1.sh contra un archivo de dispositivo

Debido a que nuestro script está probando archivos normales y “/dev/random” es un archivo de dispositivo, la prueba falla. Muy a menudo, para llegar al fondo de si un archivo existe, debe elegir cuidadosamente qué prueba usar, o necesita usar varias pruebas.

Este es “script2.sh”, que busca archivos normales y archivos de dispositivos de caracteres.

                      #!/bin/bash

if [[ -f $1 ]]
then
  echo "The file $1 exists."
else
  echo "The file $1 is missing or not a regular file."
fi

if [[ -c $1 ]]
then
  echo "The file $1 is a character device file."
else
  echo "The file $1 is missing or not a special file." 
fi
                    

Si ejecutamos este script en el archivo de dispositivo “/dev/random”, la primera prueba falla, lo que esperábamos, y la segunda prueba tiene éxito. Reconoce el archivo como un archivo de dispositivo.

                      ./script2.sh /dev/random
                    

Ejecutar script2.sh contra un archivo de dispositivo de caracteres

En realidad, lo reconoce como un archivo de dispositivo de caracteres. Algunos archivos de dispositivo son archivos de dispositivo de bloque. Tal como está, nuestro guión no se las arreglará.

                      ./script2.sh /dev/sda
                    

Ejecutando scrip2.sh contra un archivo de dispositivo de bloque

Podemos hacer uso de la lógica. OR operador e incluir otra prueba en la segunda sentencia if. Esta vez, ya sea que el archivo sea un archivo de dispositivo de caracteres o un archivo de dispositivo de bloque, la prueba devolverá verdadero. Esto es “script3.sh”.

                      #!/bin/bash

if [[ -f $1 ]]
then
  echo "The file $1 exists."
else
  echo "The file $1 is missing or not a regular file."
fi

if [[ -c $1 || -b $1 ]]
then
  echo "The file $1 is a character or block device file."
else
  echo "The file $1 is missing or not a special file." 
fi
                    

Este script reconoce tanto archivos de dispositivos de caracteres como de dispositivos de bloques.

                      ./script3.sh /dev/random
                    
                      ./script3.sh /dev/sda
                    

script3.sh maneja correctamente archivos de dispositivos de caracteres y bloques

Si es importante para usted diferenciar entre los diferentes tipos de archivos de dispositivo, puede usar anidados if declaraciones. Esto es “script4.sh”.

                      #!/bin/bash

if [[ -f $1 ]]
then
  echo "The file $1 exists."
else
  echo "The file $1 is missing or not a regular file."
fi

if [[ -c $1 ]]
then
  echo "The file $1 is a character device file."
else
  if [[ -b $1 ]]
  then
    echo "The file $1 is a block device file." 
  else
    echo "The file $1 is missing or not a device file."
  fi
fi
                    

Este script reconoce y categoriza archivos de dispositivos de caracteres y dispositivos de bloques.

                      ./script4.sh /dev/random
                    
                      ./script4.sh /dev/sda
                    

script8.sh identificando correctamente los archivos de dispositivos de caracteres y bloques

Usando el operador lógico AND podemos probar varias características a la vez. Este es “script5.sh”. Comprueba que existe un archivo y que el script tiene permisos de lectura y escritura para él.

                      #!/bin/bash

if [[ -f $1 && -r $1 && -w $1 ]]
then
  echo "The file $1 exists and we have read/write permissions."
else
  echo "The file $1 is missing, not a regular file, or we can't read/write to it."
fi
                    

Ejecutaremos el script en un archivo que nos pertenece y uno que pertenece a root .

                      ./script5.sh .bashrc
                    
                      ./script5.sh /etc/fstab
                    

script5.sh comprobando si existe un archivo y si los permisos de lectura y escritura están configurados

Para comprobar la existencia de un directorio, utilice el -d prueba. Esto es “script6.sh”. Es parte de un script de copia de seguridad. Lo primero que hace es comprobar si el directorio pasado en la línea de comandos existe o no. Utiliza la lógica NOT operador ! en el if prueba de declaraciones

                      #!/bin/bash

if [[ ! -d $1 ]]
then
  echo "Creating backup directory:" $1
  mkdir $1

  if [[ ! $? -eq 0 ]]
  then
    echo "Couldn't create backup directory:" $1
    exit
  fi
else
  echo "Backup directory exists."
fi

# continue with file backup
echo "Backing up to: "$1
                    

Si el directorio no existe, lo crea. Si los archivos de creación del directorio, el script finaliza. Si la creación del directorio tiene éxito o si el directorio ya existe, el script continúa con sus acciones de copia de seguridad.

Ejecutaremos el script y luego lo comprobaremos con ls y el -d (directorio) opción si existe el directorio de copia de seguridad.

                      ./script6.sh Documents/project-backup
                    
                      ls -d Documents/project-backup
                    

script6.sh detectando si existe un directorio

Se creó el directorio de respaldo. Si ejecutamos el script nuevamente, debería informar que el directorio ya está presente.

                      ./script6.sh
                    

script6.sh reutilizando un directorio existente

El script encuentra el directorio y continúa para realizar la copia de seguridad.

Prueba, no asumas

Tarde o temprano, las suposiciones conducirán a que sucedan cosas malas. Pruebe primero y reaccione en consecuencia.

El conocimiento es poder. Use pruebas para dar a sus scripts el conocimiento que necesitan.

Cómo dejar que los scripts de Linux detecten que se están ejecutando en máquinas virtuales

Related Posts