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

¿Qué comando se puede usar para verificar si un directorio existe o no, dentro de un script de shell Bash?

preguntado el 12 de septiembre de 08 a las 18:09

30 Respuestas

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

No obstante, como Jon Ericson señala, 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.

contestado el 07 de mayo de 20 a las 12:05

Si quiere ir a lo seguro con las herramientas GNU, utilice -- es muy recomendable (marcador de fin de opciones). De lo contrario, si su variable contiene algo que parece una opción, el script fallará al igual que con los espacios. - Marc Mutz - mmutz

Para las versiones modernas de bash, ksh, etc. [...] hay una función incorporada: fpmurphy

Una cosa a tener en cuenta: [ ! -d "$DIRECTORY" ] será cierto si $DIRECTORY no existe, o si existe pero no es un directorio. Considere algo como if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi; esto fallará si "$DIRECTORY" es un archivo. (Por supuesto, debe comprobar si mkdir de todos modos tuvo éxito; hay varias razones por las que puede fallar). Keith Thompson

Vale la pena mencionar que una vez realizada la verificación, la situación ya puede haber cambiado debido a otros procesos. En muchos casos, es mejor simplemente crear o usar el directorio y reaccionar ante una falla. - Alfa

En lugar de probar tanto el directorio (-d) y el enlace simbólico (-L), es más fácil agregar una barra a la variable, como if [ -d "${THING:+$THING/}" ]. A un directorio no le importará la barra oblicua adicional. Un archivo se evaluará como falso. Vacío permanecerá vacío, tan falso. Y un enlace simbólico se resolverá a su destino. Por supuesto, depende de tu objetivo. Si quieres go ahí, esto está bien. Si quieres bórralo, entonces el código en esta respuesta es mejor. - ghoti

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 establecido en "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

contestado el 07 de mayo de 20 a las 12:05

Otra razón para usar comillas dobles es en caso de que $ DIRECTORY no esté configurado por alguna razón. - Jon Ericson

"envuelva siempre las variables entre comillas dobles ... en un script bash". Para bash, no es técnicamente necesario cuando se usa [...]]; ver tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS (nota: sin división de palabras): "No se realiza ninguna expansión de nombre de archivo ni división de palabras entre [[y]], pero hay expansión de parámetros y sustitución de comandos". - michael

Los directorios en Unix / Linux no deben tener espacios en blanco y, por lo tanto, los scripts no deben adaptarse a ellos. Ya es bastante malo que Windows lo admita, con todas las consecuencias para las secuencias de comandos de Windows, pero por favor, por el amor de lo que sea, no es necesario introducir requisitos innecesarios. - tvCa

@tvCa Encuentro que los usuarios generalmente prefieren que se les permita más flexibilidad en los nombres de sus directorios en lugar de verse obligados a facilitar las cosas a los desarrolladores. (De hecho, cuando trato con nombres de archivo largos, encuentro que los que no tienen espacios son un problema, ya que eso mata el ajuste de palabras a pesar de que yo mismo he sufrido en el pasado por no tener en cuenta las rutas con espacios en scripts y programas) JAB

Decir ah. Los espacios son solo caracteres que normalmente no tienen glifos. De todos modos, puedes escapar de ellos con una barra invertida. - uchuugaka

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 en Bash expresiones condicionales y [ comando incorporado y [[ comando compuesto.

Respondido el 11 de Septiembre de 17 a las 15:09

o, asumiendo que solo es necesario trabajar en directorios (y los enlaces se pueden ignorar) => if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi ... o, para un comando que funciona tanto en enlaces como en directorios: rm -r tmpdir - michael

Encuentro el soporte doble versión de test hace que escribir pruebas de lógica sea más natural:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

Respondido 01 Jul 13, 02:07

por if [[ -d "$TARFILE" ]] Recibo [[: no encontrado - elidiotadelpueblo

@TheVillageIdiot y @Hedgehog, ¿estás usando bash shell? El soporte doble no es compatible de forma universal. Aquí hay una respuesta SO sobre ese punto: stackoverflow.com/questions/669452/… - yukondude

Y en Busybox ash con opciones de compilación predeterminadas [[ ]] es compatible, pero de hecho no proporciona ninguna funcionalidad diferente para [ ]. Si la portabilidad es una preocupación, quédese con [ ] y utilice las soluciones alternativas necesarias. - dudoso

... si usa construcciones bash en un script de shell, la primera línea del script debería ser: #! / bin / bash (y no #! / bin / sh, ksh, etc.) - michael

Cuando se utilizan corchetes dobles en bash, no es necesario citar las variables. - Hubert Grzeskowiak

Forma más corta:

# if $DIR is a directory, then print yes
[ -d "$DIR" ] && echo "Yes"

Respondido 02 Feb 21, 10:02

¿Funciona esto así: if $dir is a dir, then echo "yes"? Un poco de explicación ayudaría :) - Martijn

cmd && other es una abreviatura común para if cmd; then other; fi - esto funciona con la mayoría de los lenguajes de programación que admiten lógica booleana, y se conoce como evaluación de cortocircuito. - triples

El comportamiento no es el mismo bajo set -e (el cual es un mejores prácticas de programación de shell). - dolmen

@dolmen el [ -d "$DIR" ] está marcado (seguido de && echo Yes), entonces creo set -e no hace ninguna diferencia en el comportamiento de la secuencia de comandos (es decir, si la prueba falla, la secuencia de comandos continúa normalmente). - tzot

Para comprobar si existe un directorio, puede utilizar un sencillo if estructura como esta:

if [ -d directory/path to a directory ] ; then
# Things to do

else #if needed #also: elif [new condition]
# Things to do
fi

También puedes hacerlo en negativo:

if [ ! -d directory/path to a directory ] ; then
# Things to do when not an existing directory

Nota:: Ten cuidado. Deje espacios vacíos a ambos lados de los tirantes de apertura y cierre.

Con la misma sintaxis puedes usar:

-e: any kind of archive

-f: file

-h: symbolic link

-r: readable file

-w: writable file

-x: executable file

-s: file size greater than zero

contestado el 07 de mayo de 20 a las 13:05

¿Cómo es esto mejor que la respuesta aceptada de 2008, además de salirse del tema con los cambios de archivo? - Dan Dascalescu

mejor, por [! -d directorio / ruta a un directorio] - user1855805

  1. Un script simple para probar si un directorio o archivo está presente o no:

     if [ -d /home/ram/dir ]   # For file "if [ -f /home/rama/file ]"
     then
         echo "dir present"
     else
         echo "dir not present"
     fi
    
  2. Un script simple para verificar si el directorio está presente o no:

     mkdir tempdir   # If you want to check file use touch instead of mkdir
     ret=$?
     if [ "$ret" == "0" ]
     then
         echo "dir present"
     else
         echo "dir not present"
     fi
    

    Los scripts anteriores verificarán si el directorio está presente o no

    $? si el último comando es un éxito, devuelve "0", de lo contrario, un valor distinto de cero. Suponer tempdir ya está presente. Luego mkdir tempdir dará un error como el siguiente:

    mkdir: no se puede crear el directorio 'tempdir': el archivo existe

Respondido el 09 de Septiembre de 20 a las 11:09

El segundo crearía el directorio, si no existiera al principio. Entonces no es idempotente. - Shihe Zhang

👆👆👆. El segundo parece peligroso. Dado que crea el directorio, ya ni siquiera es cierto que el directorio no esté presente. - Chris

Puedes usar test -d (consulte la sección del man test).

-d file Verdadero si el archivo existe y es un directorio.

Por ejemplo:

test -d "/etc" && echo Exists || echo Does not exist

Nota la test el comando es igual que la expresión condicional [ (ver: man [), por lo que es portátil a través de scripts de shell.

[ - Este es un sinónimo de test incorporado, pero el último argumento debe ser un literal ], para que coincida con la apertura [.

Para ver posibles opciones o más ayuda, consulte:

  • help [
  • help test
  • man test or man [

respondido 16 mar '16, 17:03

O por algo completamente inútil:

[ -d . ] || echo "No"

Respondido 17 ago 09, 16:08

Nunca imprimirá "No". El directorio actual siempre existe, a menos que lo elimine otro hilo o de otras formas. - Yahid

Muestra perfecta :) dado que qué tan "únicas" son algunas respuestas en comparación con la respuesta aceptada - sergey sargsián

¿Por qué se ha votado a favor tantas veces? No responde la pregunta. - códigoforester

Aquí hay un modismo muy pragmático:

(cd $dir) || return # Is this a directory,
                    # and do we have access?

Normalmente lo envuelvo en una función:

can_use_as_dir() {
    (cd ${1:?pathname expected}) || return
}

o:

assert_dir_access() {
    (cd ${1:?pathname expected}) || exit
}

Lo bueno de este enfoque es que no tengo que pensar en un buen mensaje de error.

cd me dará un mensaje estándar de una línea para Error estándar ya. También proporcionará más información de la que podré proporcionar. Al realizar el cd dentro de una subcapa ( ... ), el comando no afecta el directorio actual de la persona que llama. Si el directorio existe, este subshell y la función son solo una operación no operativa.

El siguiente es el argumento que pasamos a cd: ${1:?pathname expected}. Esta es una forma más elaborada de sustitución de parámetros que se explica con más detalle a continuación.

Tl; dr: Si la cadena pasada a esta función está vacía, salimos nuevamente de la subcapa ( ... ) y volver de la función con el mensaje de error dado.


Citando del ksh93 página man:

${parameter:?word}

If parameter está establecido y no es nulo, luego sustituya su valor; de lo contrario, imprimir word y salir del shell (si no es interactivo). Si word se omite, se imprime un mensaje estándar.

y

Si el colon : se omite de las expresiones anteriores, entonces el shell solo verifica si el parámetro está establecido o no.

La redacción aquí es peculiar de la documentación de shell, como word puede hacer referencia a cualquier cadena razonable, incluidos los espacios en blanco.

En este caso particular, sé que el mensaje de error estándar 1: parameter not set no es suficiente, por lo que me acerco al tipo de valor que esperamos aquí: el pathname de un directorio.

Una nota filosófica:

El shell no es un lenguaje orientado a objetos, por lo que el mensaje dice pathnameno, directory. En este nivel, prefiero mantenerlo simple: los argumentos de una función son solo cadenas.

contestado el 07 de mayo de 20 a las 13:05

Esto hace más que solo verificar la existencia: esta verificación de accesibilidad a su nivel de usuario. ASÍ que la pregunta representa existencia solo. Entonces la respuesta correcta es test -d como explicó @Grundlefleck. - F.Hauri

@ F.Hauri - No pidió nada más, eso es cierto. Sin embargo, he descubierto que normalmente necesito saber más que eso. - henk langeveld

Y nunca se me ocurrió que ninguna prueba puede ser concluyente, a menos que se ejecute como root. test -d /unreadable/exists fallará, incluso si el argumento existe. - henk langeveld

if [ -d "$Directory" -a -w "$Directory" ]
then
    #Statements
fi

El código anterior verifica si el directorio existe y si se puede escribir.

contestado el 25 de mayo de 11 a las 09:05

-a es idéntico en efecto a -e. Se ha "desaprobado" y se desaconseja su uso. - PrimoCocaína

DIRECTORY=/tmp

if [ -d "$DIRECTORY" ]; then
    echo "Exists"
fi

Prueba en línea

Respondido 09 Oct 19, 07:10

recordar space después de [ -> [`` -d. recibí un error porque faltaba espacio - Raj

DE NUEVO, esta respuesta ya se dio en 2008, con explicaciones más útiles. Lo único nuevo aquí es el patio de juegos en línea. - Dan Dascalescu

Más funciones usando find

  • Verifique la existencia de la carpeta dentro de los subdirectorios:

      found=`find -type d -name "myDirectory"`
      if [ -n "$found" ]
      then
          # The variable 'found' contains the full path where "myDirectory" is.
          # It may contain several lines if there are several folders named "myDirectory".
      fi
    
  • Verifique la existencia de una o varias carpetas según un patrón dentro del directorio actual:

      found=`find -maxdepth 1 -type d -name "my*"`
      if [ -n "$found" ]
      then
          # The variable 'found' contains the full path where folders "my*" have been found.
      fi
    
  • Ambas combinaciones. En el siguiente ejemplo, verifica la existencia de la carpeta en el directorio actual:

      found=`find -maxdepth 1 -type d -name "myDirectory"`
      if [ -n "$found" ]
      then
          # The variable 'found' is not empty => "myDirectory"` exists.
      fi
    

Respondido el 17 de diciembre de 20 a las 13:12

Hola Niel. Tu idea puede ser útil para comprobar la existencia de directorios en función de un patrón como: find -maxdepth 1 -type d -name 'pattern'. ¿Te importa si añado en tu respuesta este truco? Salud ;) - oho

Escriba este código en el indicador de Bash:

if [ -d "$DIRECTORY" ]; then
    # If true this block of code will execute
fi

contestado el 07 de mayo de 20 a las 13:05

DE NUEVO, esta respuesta ya se dio en 2008. ¡¿Qué sentido tiene repetirla ?! - Dan Dascalescu

En realidad, debería utilizar varias herramientas para conseguir un enfoque a prueba de balas:

DIR_PATH=`readlink -f "${the_stuff_you_test}"` # Get rid of symlinks and get abs path
if [[ -d "${DIR_PATH}" ]] ; Then # Now you're testing
    echo "It's a dir";
fi

No hay necesidad de preocuparse por los espacios y los caracteres especiales siempre que utilice "${}".

Tenga en cuenta que [[]] no es tan portátil como [], pero dado que la mayoría de la gente trabaja con versiones modernas de Bash (ya que, después de todo, la mayoría de la gente ni siquiera trabaja con la línea de comando :-p), el beneficio es mayor que el problema.

contestado el 07 de mayo de 20 a las 12:05

¿Ha considerado simplemente hacer lo que quiera hacer en el if en lugar de mirar antes de saltar?

Es decir, si desea verificar la existencia de un directorio antes de ingresar, intente simplemente hacer esto:

if pushd /path/you/want/to/enter; then
    # Commands you want to run in this directory
    popd
fi

Si el camino que le das pushd existe, lo ingresarás y saldrá con 0, lo que significa el then parte de la declaración se ejecutará. Si no existe, no pasará nada (aparte de algún resultado que diga que el directorio no existe, lo que probablemente sea un efecto secundario útil de todos modos para la depuración).

Parece mejor que esto, lo que requiere que te repitas:

if [ -d /path/you/want/to/enter ]; then
    pushd /path/you/want/to/enter
    # Commands you want to run in this directory
    popd
fi

Lo mismo funciona con cd, mv, rm, etc ... si los prueba en archivos que no existen, saldrán con un error e imprimirán un mensaje diciendo que no existe, y su then se omitirá el bloque. Si los prueba en archivos que existen, el comando se ejecutará y saldrá con un estado de 0, permitiendo tu then bloque para ejecutar.

contestado el 12 de mayo de 20 a las 07:05

pushd es para mí la forma más elegante de hacer esto. Estaba a punto de publicarlo como respuesta :) - melmass

[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"

NB: Citar variables es una buena práctica.

Explicación:

  • -d: comprueba si es un directorio
  • -L: compruebe si es un enlace simbólico

contestado el 07 de mayo de 20 a las 14:05

Una explicación estaría en orden (por editando tu respuesta, no aquí en los comentarios). - Pedro Mortensen

Para verificar más de un directorio, use este código:

if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
    # Things to do
fi

Respondido el 27 de enero de 16 a las 13:01

¿Cómo comprobar que no existe? - cazador de perros

Verifique si el directorio existe, de lo contrario, cree uno:

[ -d "$DIRECTORY" ] || mkdir $DIRECTORY

contestado el 07 de mayo de 20 a las 13:05

Podrías usar mkdir -p "$DIRECTORY" para el mismo efecto. - Pastilla Logan

Necesita comillas dobles alrededor $DIRECTORY en la mkdir parte también. De lo contrario, la división de palabras puede generar resultados no deseados. Por ejemplo: dir="a b"; mkdir $dir resultará en dos directorios a y b siendo creado, en lugar de un solo a b directorio. - códigoforester

[ -d ~/Desktop/TEMPORAL/ ] && echo "DIRECTORY EXISTS" || echo "DIRECTORY DOES NOT EXIST"

Respondido 28 Jul 13, 09:07

Una explicación estaría en orden (por editando tu respuesta, no aquí en los comentarios). - Pedro Mortensen

Esta respuesta envuelto como un script de shell

Ejemplos

$ is_dir ~                           
YES

$ is_dir /tmp                        
YES

$ is_dir ~/bin                       
YES

$ mkdir '/tmp/test me'

$ is_dir '/tmp/test me'
YES

$ is_dir /asdf/asdf                  
NO

# Example of calling it in another script
DIR=~/mydata
if [ $(is_dir $DIR) == "NO" ]
then
  echo "Folder doesnt exist: $DIR";
  exit;
fi

es_dir

function show_help()
{
  IT=$(CAT <<EOF

  usage: DIR
  output: YES or NO, depending on whether or not the directory exists.

  )
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$1" ]
then
  show_help
fi

DIR=$1
if [ -d $DIR ]; then 
   echo "YES";
   exit;
fi
echo "NO";

contestado el 23 de mayo de 17 a las 13:05

Usando el patrón de velas del -e check buscará archivos y esto incluye directorios.

if [ -e ${FILE_PATH_AND_NAME} ]
then
    echo "The file or directory exists."
fi

Respondido 28 Jul 13, 09:07

Y no responde correctamente a la pregunta del OP: ¿es un directorio? - marco stewart

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists
fi

Eso no es completamente cierto...

Si desea ir a ese directorio, también debe tener los derechos de ejecución en el directorio. Quizás también necesites tener derechos de escritura.

Por lo tanto:

if [ -d "$DIRECTORY" ] && [ -x "$DIRECTORY" ] ; then
    # ... to go to that directory (even if DIRECTORY is a link)
    cd $DIRECTORY
    pwd
fi

if [ -d "$DIRECTORY" ] && [ -w "$DIRECTORY" ] ; then
    # ... to go to that directory and write something there (even if DIRECTORY is a link)
    cd $DIRECTORY
    touch foobar
fi

contestado el 07 de mayo de 20 a las 13:05

Según Jonathancomentario de:

Si desea crear el directorio y aún no existe, la técnica más sencilla es utilizar mkdir -p que crea el directorio, y cualquier directorio que falte en la ruta, y no falla si el directorio ya existe, por lo que puede hacerlo todo a la vez con:

mkdir -p /some/directory/you/want/to/exist || exit 1

contestado el 07 de mayo de 20 a las 13:05

El ls comando junto con -l La opción (lista larga) devuelve información de atributos sobre archivos y directorios.
En particular, el primer carácter de ls -l salida suele ser un d o con una - (pizca). En caso de d el que aparece es un directorio seguro.

El siguiente comando en una sola línea le dirá si el ISDIR variable contiene una ruta a un directorio o no:

[[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] &&
    echo "YES, $ISDIR is a directory." || 
    echo "Sorry, $ISDIR is not a directory"

Uso práctico:

    [claudio@nowhere ~]$ ISDIR="$HOME/Music" 
    [claudio@nowhere ~]$ ls -ld "$ISDIR"
    drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." ||
        echo "Sorry, $ISDIR is not a directory"
    YES, /home/claudio/Music is a directory.

    [claudio@nowhere ~]$ touch "empty file.txt"
    [claudio@nowhere ~]$ ISDIR="$HOME/empty file.txt" 
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." || 
        echo "Sorry, $ISDIR is not a directoy"
    Sorry, /home/claudio/empty file.txt is not a directory

Respondido 26 Feb 14, 11:02

+1, pero cuando ISDIR no existe en absoluto, obtiene un mensaje de error, así como su mensaje de diagnóstico. - ysap

Use el file programa. Teniendo en cuenta que todos los directorios también son archivos en Linux, bastaría con emitir el siguiente comando:

file $directory_name

Comprobando un archivo inexistente: file blah

Salida: cannot open 'blah' (No such file or directory)

Comprobando un directorio existente: file bluh

Salida: bluh: directory

contestado el 12 de mayo de 20 a las 07:05

Buena idea, pero una lástima en ambos casos, el comando de archivo siempre devuelve 0 código de salida. También cuando no se puede encontrar el archivo / directorio :(. - danger89

file="foo" 
if [[ -e "$file" ]]; then echo "File Exists"; fi;

Respondido 22 Feb 13, 02:02

Una explicación estaría en orden (por editando tu respuesta, no aquí en los comentarios). - Pedro Mortensen

Existen excelentes soluciones, pero en última instancia, todos los scripts fallarán si no se encuentra en el directorio correcto. Entonces codifique como este:

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

se ejecutará correctamente solo si en el momento de la ejecución se encuentra en un directorio que tiene un subdirectorio que debe verificar.

Entiendo la pregunta inicial como esta: para verificar si existe un directorio independientemente de la posición del usuario en el sistema de archivos. Entonces, usar el comando 'buscar' podría funcionar:

dir=" "
echo "Input directory name to search for:"
read dir
find $HOME -name $dir -type d

Esta solución es buena porque permite el uso de comodines, una característica útil cuando se buscan archivos / directorios. El único problema es que, si el directorio buscado no existe, el comando 'buscar' no imprimirá nada en salida estándar (no es una solución elegante para mi gusto) y, no obstante, tendrá una salida cero. Quizás alguien pueda mejorar esto.

contestado el 07 de mayo de 20 a las 13:05

Me ofendería si un programa buscara en todo mi disco duro para encontrar un directorio en lugar de simplemente buscar cortésmente en mi directorio de trabajo actual o usar la ruta absoluta que le doy. Lo que ha sugerido podría ser bueno para una herramienta llamada locate pero no bueno para nada mas ... - Sarnold

La siguiente find puede ser usado,

find . -type d -name dirname -prune -print

contestado el 07 de mayo de 20 a las 13:05

(1)

[ -d Piyush_Drv1 ] && echo ""Exists"" || echo "Not Exists"

(2)

[ `find . -type d -name Piyush_Drv1 -print | wc -l` -eq 1 ] && echo Exists || echo "Not Exists"

(3)

[[ -d run_dir  && ! -L run_dir ]] && echo Exists || echo "Not Exists"

Si se encuentra un problema con uno de los enfoques proporcionados anteriormente:

Con la ls mando; los casos en que no existe un directorio: se muestra un mensaje de error

[[ `ls -ld SAMPLE_DIR| grep ^d | wc -l` -eq 1 ]] && echo exists || not exists

-ksh: not: not found [No existe tal archivo o directorio]

contestado el 07 de mayo de 20 a las 13:05

¿A qué se refiere "arriba"? ¿Las tres líneas de comando en esta respuesta o respuestas anteriores? (Por favor responda por editando tu respuesta, no aquí en los comentarios. Gracias por adelantado.). - Pedro Mortensen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.