Cómo verificar correctamente si el archivo existe en Bash o Shell (con ejemplos)
Tabla de contenido
En este tutorial, cubriré diferentes atributos que puede usar en scripts bash o shell para verificar archivos y directorios. Puede usar expresiones condicionales bash con ]
o usar prueba con para verificar si el archivo existe.
Lo haremos usar bash if y el operador else para todos los ejemplos, por lo que le recomendaría leer: Guía de uso de Bash if else para principiantes absolutos
1. Bash / Shell: compruebe si el archivo existe y es un archivo normal
Esta sección muestra los ejemplos para verificar si existe un archivo regular en bash.
1.1: Método-1: Usar corchetes simples o dobles
Usar corchetes dobles ]
#!/bin/bashFILE="/etc/passwd"if ];then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
Uso de corchetes simples
#!/bin/bashFILE="/etc/passwd"if ;then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
1.2: Método 2: Uso del comando de prueba
El comando test
se usa para verificar tipos de archivos y comparar valores.
#!/bin/bashFILE="/etc/passwd"if test -f $FILE; then echo "$FILE exists"else echo "$FILE missing"fi
1.3: Método-3: Línea única
Podemos usar corchetes simples o dobles aquí en este ejemplo. Recomendaría usar siempre corchetes dobles cuando esté escribiendo un código de línea en shell, ya que minimiza el riesgo de recibir advertencias en la consola cuando se produce la división de palabras.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists" || echo "$FILE missing"
La instrucción después de &&
se ejecutará si tiene éxito. Si la primera condición devuelve FALSE, entonces se ejecutará la declaración con ||
.
De manera similar, use el comando de prueba para verificar si existe un archivo regular en bash o script de shell en una sola línea .
#!/bin/bashFILE="/etc/passwd"test -f $FILE && echo "$FILE exists" || echo "$FILE missing"
2. Bash / Shell: Verifique si el archivo existe (está vacío o no)
Para verificar si el archivo existe y si está vacío o si tiene algún contenido, usamos el atributo «-s
»
2.1: Método 1: Uso de corchetes simples o dobles
Verifique si el archivo existe y está vacío o no usando corchetes dobles ]
#!/bin/bashFILE="/etc/passwd"if ]; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
Verifique si el archivo existe y está vacío o no está vacío usando corchetes dobles
if ; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
2.2: Método 2: Uso del comando de prueba
Usando el comando de prueba, combinamos el atributo -s
para verificar si El archivo existe y está vacío o tiene algún contenido:
2.3: Método 3: Línea única
Podemos usar corchetes dobles o simples para una línea de este tipo, pero como dije antes, recomendaría usar corchetes dobles.
#!/bin/bashFILE="/etc/passwd"test -s $FILE && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
De manera similar, con el comando de prueba podemos usar &&
y ||
operador para verificar el archivo en un comando de una sola línea dentro de nuestro script de shell.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
3. Bash / Shell: Verifique si el directorio existe
Espero que sepas que en Linux todo es un archivo. Entonces, de esa manera, un directorio también se considera un archivo. Podemos usar el atributo «-d
» para verificar si existe un directorio en la programación de shell.
3.1: Método 1: Usar corchetes simples o dobles
Podemos usar el atributo -d
dentro de un solo o corchetes dobles
]
para verificar si el directorio existe.
#!/bin/bashDIR="/var/log"if ]; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
De manera similar, usamos corchetes simples en este ejemplo para verificar si el directorio está preestablecido dentro del script de shell.
#!/bin/bashDIR="/var/log"if ; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.2: Método-2: Usar el comando de prueba
En este ejemplo usaremos el comando de prueba para asegurarnos de que el directorio esté presente o no antes de realizar cierta tarea.
#!/bin/bashDIR="/var/log"if test -d $DIR; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.3: Método 3: Línea única
En este ejemplo usaremos corchetes simples y dobles en forma de línea única para verificar para el directorio. La instrucción después del operador &&
se ejecutará si la primera condición es VERDADERA y si es FALSA, se ejecutará la instrucción de la ||
condición » .
#!/bin/bashDIR="/var/log"] && echo "$DIR exists" || echo "$DIR doesn"t exist"
Recomendaría usar ]
en lugar de para tales códigos de línea en la programación de shell.
De manera similar con &&
y ||
podemos usar el comando de prueba para verificar si el directorio existe
#!/bin/bashDIR="/var/log"test -d $DIR && echo "$DIR exists" || echo "$DIR doesn"t exist"
4. Bash / Shell: Verifique si el directorio existe (vacío o no vacío)
No hay atributos de shell como he usado en todos los otros ejemplos y escenarios en este tutorial. Pero tenemos algunos trucos que podemos usar para verificar si el directorio está vacío o no.
4.1: Método 1: enumerar el contenido del directorio y verificar
En este ejemplo, enumeraremos el contenido del directorio, suprimiremos la salida y luego, según el código de salida, verificaremos si el directorio está vacío o contiene algunos content
#!/bin/bashDIR="/tmp"if ls -1qA $DIR | grep -q . ; then echo "$DIR is not -empty"else echo "$DIR is empty"fi
También podemos revertir esto poniendo una condición NOT (!
). Entonces se vería así:
#!/bin/bashDIR="/tmp"if ! ls -1qA $DIR | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
El resultado sería el mismo en ambos scripts de ejemplo.
4.2: Método-2: Usando comando de búsqueda
Podemos usar el comando de búsqueda y luego suprimir la salida para verificar si el directorio de destino tiene algún contenido o no.
#!/bin/bashDIR="/tmp"if find -- "$DIR" -prune -type d -empty | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
4.3: Método 3: Enumere el contenido
De nuevo, como dije, ya que no hay una manera fácil de verificar si un directorio está vacío o no usa algunos atributos, listaremos el contenido del directorio. Si no obtiene resultados, entonces el directorio está vacío o no está vacío
#!/bin/bashDIR="/tmp"if ] ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
5. Bash / Shell: Lista de atributos para probar el archivo
De manera similar, hay muchos más atributos que puede usar con scripts de shell para verificar diferentes tipos de archivos, como enlaces simbólicos, permisos de archivos, etc.
Atributos | ¿Qué hace? |
---|---|
-a FILE |
Verdadero si FILE existe |
-b FILE |
Verdadero si FILE existe y es un archivo especial de bloque. |
-c FILE |
Verdadero si FILE existe y es un archivo especial de caracteres. |
-d FILE |
Verdadero si FILE existe y es un directorio. |
Verdadero si FILE existe |
|
-f FILE |
Verdadero si FILE existe y es un archivo normal |
-g FILE |
Verdadero si FILE existe y su bit set-group-id está establecido |
-h FILE |
Verdadero si FILE existe y es un enlace simbólico |
-k FILE |
Verdadero si FILE existe y su bit «pegajoso» está establecido |
-p FILE |
Verdadero si FILE existe y es tubería con nombre (FIFO) |
-r FILE |
Verdadero si FILE existe y es legible |
-s FILE |
Verdadero si FILE existe y tiene un tamaño mayor que cero |
-u FILE |
Verdadero si FILE existe y su bit set-user-id está establecido |
-w FILE |
Verdadero si FILE existe y se puede escribir |
-x FILE |
Verdadero si FILE existe y es ejecutable |
-G FILE |
Verdadero si FILE existe y es propiedad del ID de grupo efectivo |
-L FILE |
Verdadero si FILE existe y es un enlace simbólico |
-N FILE |
Verdadero si FILE existe y se ha modificado desde la última lectura |
-o FILE |
Verdadero si FILE existe y es propiedad de ID de usuario |
-S FILE |
Verdadero si FILE existe y es un socket |
|
Verdadero si FILE1 y FILE2 se refieren al mismo dispositivo y números de inodo |
FILE1 -nt FILE2 |
Verdadero si FILE1 es más reciente (según la fecha de modificación) que FILE2 , o si FILE1 existe y FILE2 no |
FILE1 -ot FILE2 |
Verdadero si FILE1 es anterior que FILE2 , o si FILE2 existe y FILE1 no |