Cómo saber si un archivo o directorio existe desde un script Bash

La herramienta test permite realizar diferentes tipos de verificaciones sobre todo tipo de archivos. Puede ser útil para tomar diferentes acciones desde scripts Bash dependiendo de la existencia, tipo y contenido de archivos y directorios. Veamos algunos ejemplos de uso de esta herramienta, parte del paquete coreutils.







test realiza una verificación según la opción indicada sobre un archivo o directorio pasado como parámetro y finaliza con el estado 0 o 1 como código de retorno si el resultado fue verdadero o falso, respectivamente.

Ejemplos de uso

Por ejemplo, es posible determinar si un directorio existe empleando la opción -d :

emi@hal9000:~$ test -d /etc emi@hal9000:~$ echo $? 0

emi@hal9000:~$ test -d /etcccc emi@hal9000:~$ echo $? 1

Tener en cuenta que la variable de entorno ? muestra el código de retorno del último comando ejecutado.

Se observa que retorna 0 (verdadero) para el primer intento, y 1 para el segundo. Es posible comprobar que /etc existe y /etcccc no:

emi@hal9000:~$ ls -ld /etc drwxr-xr-x 136 root root 12288 Feb 13 13:42 /etc emi@hal9000:~$ ls -ld /etcccc ls: cannot access '/etcccc': No such file or directory

Generalmente se utiliza test dentro de condiciones ( if ) para realizar diferentes acciones. Por ejemplo mostra "ok" o "error" por salida estándar:

emi@hal9000:~$ if test -d /etc; then echo "ok"; else echo "error"; fi ok emi@hal9000:~$ if test -d /etccc; then echo "ok"; else echo "error"; fi error

Con la opción -f es posible verificar si un archivo regular existe:

emi@hal9000:~$ test -f /etc ; echo $? 1 emi@hal9000:~$ test -f /etc/hosts ; echo $? 0

Tal como se observa, si el archivo existe pero no es un archivo regular (por ejemplo es un directorio o un socket), retorna falso.

Otros tests

Por ejemplo, es posible determinar si un archivo es un socket con -S :

emi@hal9000:~$ netstat -xl | grep cups unix 2 [ ACC ] STREAM LISTENING 110968 /var/run/cups/cups.sock emi@hal9000:~$ test -f /var/run/cups/cups.sock; echo $? 1 emi@hal9000:~$ test -S /var/run/cups/cups.sock; echo $? 0

También es posible comprobar permisos. En este ejemplo, determinar si el usuario actual tiene permiso de escritura sobre un directorio:

emi@hal9000:~$ test -w $HOME; echo $? 0 emi@hal9000:~$ test -w /sbin; echo $? 1

Para más tests sobre archivos y directorios, consultar la página de manual:

man test



Tal vez pueda interesarte

