Saltar al contenido

¿Cómo puedo verificar si existe un directorio en un script de shell Bash?

Solución:

Para comprobar si existe un directorio en un script de shell, puede utilizar lo siguiente:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

O para verificar si no existe un directorio:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

Sin embargo, como señala Jon Ericson, es posible que los comandos posteriores no funcionen como se esperaba si no tiene en cuenta que un enlace simbólico a un directorio también pasará esta verificación. Por ejemplo, ejecutando esto:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

Producirá el mensaje de error:

rmdir: failed to remove `symlink': Not a directory

Por lo tanto, es posible que los enlaces simbólicos deban tratarse de manera diferente, si los comandos posteriores esperan directorios:

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi

Preste especial atención a las comillas dobles que se utilizan para envolver las variables. La razón de esto se explica por 8jean en otra respuesta.

Si las variables contienen espacios u otros caracteres inusuales, probablemente hará que el script falle.

Recuerde siempre envolver las variables entre comillas dobles al hacer referencia a ellas en un script Bash. Los niños de estos días crecen con la idea de que pueden tener espacios y muchos otros personajes divertidos en los nombres de sus directorios. (¡Espacios! ¡En mis días, no teníamos espacios elegantes!;))

Un día, uno de esos niños ejecutará su guión con $DIRECTORY ajustado a "My M0viez" y tu guión explotará. No quieres eso. Así que usa esto.

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

Nota la -D La prueba puede producir algunos resultados sorprendentes:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

Archivo bajo: “¿Cuándo un directorio no es un directorio?” La respuesta: “Cuando es un enlace simbólico a un directorio”. Una prueba un poco más completa:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

Puede encontrar más información en el manual de Bash sobre expresiones condicionales de Bash y [ comando incorporado y el [[ comando compuesto.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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