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

3725

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

Grundlefleck
fuente

Respuestas:

5151

Para verificar si existe un directorio en un script de shell, puede usar lo siguiente:

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

O para verificar si un directorio no existe:

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

Sin embargo, como señala Jon Ericson , los comandos posteriores pueden no funcionar según lo previsto si no tiene en cuenta que un enlace simbólico a un directorio también pasará esta verificación. Ej. Ejecutar 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, los enlaces simbólicos pueden tener que 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

Tome nota particular de las comillas dobles utilizadas para ajustar 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.

Grundlefleck
fuente
29
Si desea jugar de forma segura con las herramientas GNU, --se recomienda su uso (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
2
Para las versiones modernas de bash, ksh, etc. [...] es una
versión
79
Una cosa a tener en cuenta: [ ! -d "$DIRECTORY" ]será verdad o bien si $DIRECTORYno existe, o si lo hace existe, pero no es un directorio. Considera algo como if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi; esto fallará si "$DIRECTORY"es un archivo. (Por supuesto, usted debe comprobar si mkdirtuvieron éxito todos modos, hay una serie de razones por las que puede fallar.)
Keith Thompson
55
Vale la pena mencionar que tan pronto como se realizó la verificación, la situación puede haber cambiado debido a otros procesos. En muchos casos, es mejor simplemente crear o usar el directorio y reaccionar ante una falla.
Alfe
12
En lugar de probar tanto el directorio ( -d) como el enlace simbólico ( -L), es más fácil agregar una barra diagonal a la variable, como if [ -d "${THING:+$THING/}" ]. A un directorio no le importará la barra extra. Un archivo se evaluará como falso. Vacío permanecerá vacío, tan falso. Y un enlace simbólico se resolverá en su destino. Por supuesto, depende de tu objetivo. Si quieres ir allí, está bien. Si desea eliminarlo , entonces el código en esta respuesta es mejor.
ghoti
531

Recuerde siempre envolver las variables entre comillas dobles cuando haga referencia a ellas en un script Bash. En la actualidad, los niños 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 script con $DIRECTORYset to "My M0viez"y su script explotará. No quieres eso. Entonces usa esto.

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi
8jean
fuente
99
Otra razón para usar comillas dobles es en caso de que $ DIRECTORY no esté configurado por alguna razón.
Jon Ericson
2
"siempre envuelve las variables entre comillas dobles ... en un script bash". Para bash, no es técnicamente necesario cuando se usa [[...]]; consulte tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS (nota: sin división de palabras): "No se produce la expansión del nombre de archivo ni la división de palabras entre [[y]], pero hay expansión de parámetros y sustitución de comandos".
michael
2
Los directorios en Unix / Linux no deberían tener espacios en blanco, y posteriormente los scripts no deberían adaptarse a él. Ya es bastante malo que Windows lo admita, con todas las consecuencias de las secuencias de comandos de Windows, pero, por amor a lo que sea, no es necesario introducir requisitos innecesarios.
tvCa
18
@tvCa Creo 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 para los desarrolladores. (De hecho, cuando se trata de nombres de archivo largos, encuentro los sin espacios a ser molesto, ya que mata ajuste de texto a pesar de que yo mismo he sufrido en el pasado de no tener en cuenta las trayectorias con espacios en las secuencias de comandos y programas.)
JAB
2
Decir ah. Los espacios son solo caracteres que generalmente no tienen glifos. De todos modos, puedes escapar de ellos con una barra invertida.
uchuugaka
228

Tenga en cuenta que la prueba -d 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 se trata de un enlace simbólico a un directorio". Una prueba un poco más exhaustiva:

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

Jon Ericson
fuente
12
o, suponiendo que solo sea 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 en ambos enlaces y directorios:rm -r tmpdir
michael
218

Creo que la versión de doble paréntesistest 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
yukondude
fuente
porque if [[ -d "$TARFILE" ]]
obtengo
15
@TheVillageIdiot y @Hedgehog, ¿estás usando bash shell? El doble soporte no es universalmente compatible. Aquí hay una respuesta SO en ese punto: stackoverflow.com/questions/669452/…
yukondude
66
Y en Busybox [[ ]]se admite la ceniza con opciones de compilación predeterminadas , pero de hecho no proporciona ninguna funcionalidad diferente [ ]. Si la portabilidad es una preocupación, quédese [ ]y use las soluciones necesarias.
dubiousjim
66
... si usa construcciones bash en un script de shell, la primera línea del script debe ser: #! / bin / bash (y no #! / bin / sh, ksh, etc.)
michael
Cuando use corchetes dobles en bash, no necesita citar las variables.
Hubert Grzeskowiak
157

Forma más corta:

[ -d "$DIR" ] && echo "Yes"
elmarco
fuente
66
¿Funciona así if $dir is a dir, then echo "yes"? Un poco de explicación ayudaría :)
Martijn
55
cmd && otheres una abreviatura común para if cmd; then other; fi: funciona con la mayoría de los lenguajes de programación que admiten la lógica booleana, y se conoce como evaluación de cortocircuito .
tripleee
1
El comportamiento no es el mismo bajo set -e(que es una práctica recomendada de programación de shell ).
dolmen
1
@dolmen the [ -d "$DIR" ]está marcado (seguido de && echo Yes), por lo que creo set -eque no hace ninguna diferencia en el comportamiento del script (es decir, si la prueba falla, el script continúa normalmente).
tzot
132

Para verificar si existe un directorio, puede usar una ifestructura simple 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 las llaves 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
Jorge Barroso
fuente
¿Cómo es esto mejor que la respuesta aceptada de 2008, además de salirse del tema con los cambios de archivos?
Dan Dascalescu
mejor, por [! -d directorio / ruta a un directorio]
user1855805
108
  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

    Las secuencias de comandos anteriores verificarán si el directorio está presente o no

    $? si el último comando es exitoso, devuelve "0", de lo contrario, un valor distinto de cero. Supongamos tempdirque ya está presente. Luego mkdir tempdirdará un error como el siguiente:

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

yoctotutor.com
fuente
44
El segundo crearía el directorio, si no existiera al principio. Entonces no es idempotente.
Shihe Zhang
👆👆👆. El segundo parece peligroso. Como crea el directorio, ya ni siquiera es cierto que el directorio no esté presente.
Chris
92

Puedes usar test -d(ver 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: El testcomando es el mismo 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 la testconstrucción, pero el último argumento debe ser ], literal , para que coincida con la apertura [.

Para posibles opciones o ayuda adicional, verifique:

  • help [
  • help test
  • man test o man [
kenorb
fuente
55

O para algo completamente inútil:

[ -d . ] || echo "No"
algo
fuente
66
Nunca imprimirá "No". El directorio actual siempre existe, a menos que sea eliminado por otro hilo u otras formas.
Jahid
Muestra perfecta :) dado que cuán "únicas" son algunas respuestas en comparación con la respuesta aceptada
Sergey Sargsyan
44
¿Por qué se ha votado esto tantas veces? No responde la pregunta.
codeforester
PORQUE ES LA MEJOR RESPUESTA EVA
Karl Morrison
52

Aquí hay un lenguaje 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.

cdya me dará un mensaje estándar de una línea al error estándar . También proporcionará más información de la que podré proporcionar. Al realizar cddentro de una subshell ( ... ), el comando no afecta el directorio actual de la persona que llama. Si el directorio existe, este subshell y la función son solo un no-op.

El siguiente es el argumento de 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 que se pasa a esta función está vacía, nuevamente salimos de la subshell ( ... )y regresamos de la función con el mensaje de error dado.


Citando de la ksh93página del manual:

${parameter:?word}

Si parameter se establece y no es nulo, sustituya su valor; de lo contrario, imprima wordy salga del shell (si no es interactivo). Si wordse omite, se imprime un mensaje estándar.

y

Si :se omiten los dos puntos de las expresiones anteriores, entonces el shell solo verifica si el parámetro está configurado o no.

La redacción aquí es peculiar de la documentación del shell, ya que wordpuede referirse a cualquier cadena razonable, incluido el espacio en blanco.

En este caso particular, sé que el mensaje de error estándar 1: parameter not setno es suficiente, así que amplío el tipo de valor que esperamos aquí: elpathname de un directorio.

Una nota filosófica:

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

Henk Langeveld
fuente
Esto hace más que solo verificar la existencia: esta verificación de accesibilidad en su nivel de usuario. SO pregunta significa solo existencia . Entonces, la respuesta correcta es test -dcomo explicó @Grundlefleck.
F. Hauri
77
@ F.Hauri - No pidió nada más, eso es cierto. Sin embargo, descubrí 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/existsfallará, incluso si el argumento existe.
Henk Langeveld
36
if [ -d "$Directory" -a -w "$Directory" ]
then
    #Statements
fi

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

muralikrishna
fuente
1
-a es idéntico en efecto a -e. Se ha "desaprobado" y se desaconseja su uso.
CousinCocaine
27
DIRECTORY=/tmp

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

Probar en línea

Vishal
fuente
recordar spacedespués [-> [`` -d . recibí un error por falta de espacio
Raj
44
DE NUEVO , esta respuesta ya se dio en 2008, con explicaciones más útiles. Lo único nuevo aquí es el área de juegos en línea.
Dan Dascalescu
24

Escriba este código en el indicador de Bash:

if [ -d "$DIRECTORY" ]; then
    # If true this block of code will execute
fi
santosh
fuente
DE NUEVO , esta respuesta ya se dio en 2008. ¿Qué sentido tiene repetirla?
Dan Dascalescu
21

Más funciones con 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 en función de 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
Neil Neyman
fuente
Hola niel Su 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? Cheers;)
olibre
20

En realidad, debe usar varias herramientas para obtener 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 espacios y caracteres especiales siempre y cuando utilice "${}" .

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

e-satis
fuente
17

¿Has considerado simplemente hacer lo que quieras hacer en el if lugar de mirar antes de saltar?

Es decir, si desea verificar la existencia de un directorio antes de ingresarlo, intente 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 pushdexiste, lo ingresarás y saldrá con 0, lo que significa quethen se ejecutará parte de la declaración. Si no existe, no sucederá nada (aparte de algún resultado que indique que el directorio no existe, lo que probablemente sea un efecto secundario útil para la depuración).

Parece mejor que esto, que requiere repetirse:

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 se los pruebe archivos que no existen, que van a salir con un error e imprimir un mensaje que dice que no existe, y su thense omitirán bloque. Si los prueba en archivos que existen, el comando se ejecutará y saldrá con un estado de 0, permitiendo que su thenbloque se ejecute.

ArtOfWarfare
fuente
2
Pushd es para mí la forma más elegante de hacer esto. Estaba a punto de publicarlo como respuesta :)
melMass
16
[[ -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: verifica si es un directorio
  • -L: verifica si es un enlace simbólico
Jahid
fuente
Una explicación estaría en orden ( editando su respuesta , no aquí en los comentarios).
Peter Mortensen
15

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

if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
    # Things to do
fi
Raamesh Keerthi
fuente
¿Cómo puedes comprobar que no existe?
perrohunter
15

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

[ -d "$DIRECTORY" ] || mkdir $DIRECTORY
David Okwii
fuente
16
Podrías usar mkdir -p "$DIRECTORY"para el mismo efecto.
Recogida de Logan
13
[ -d ~/Desktop/TEMPORAL/ ] && echo "DIRECTORY EXISTS" || echo "DIRECTORY DOES NOT EXIST"
Juan Carlos Kuri Pinto
fuente
Una explicación estaría en orden ( editando su respuesta , no aquí en los comentarios).
Peter Mortensen
11

Esta respuesta envuelta 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

is_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";
Brad Parks
fuente
10

El uso de la -ecomprobación buscará archivos y esto incluye directorios.

if [ -e ${FILE_PATH_AND_NAME} ]
then
    echo "The file or directory exists."
fi
bailey86
fuente
1
Y no responde correctamente la pregunta del OP: ¿es un directorio?
Mark Stewart el
8

Según el comentario de Jonathan :

Si desea crear el directorio y todavía no existe, entonces la técnica más simple es usar el mkdir -pque crea el directorio, y cualquier directorio faltante 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
kenorb
fuente
7
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 necesite 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
Peter Mortensen
fuente
7

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

file $directory_name

Comprobación de un archivo inexistente: file blah

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

Comprobando un directorio existente: file bluh

Salida: bluh: directory

Sudip Bhandari
fuente
1
Buena idea, sin embargo, es una lástima que en ambos casos el comando de archivo devuelva siempre 0 código de salida. También cuando no se puede encontrar el archivo / directorio :(.
danger89
6

El lscomando junto con la -lopción (lista larga) devuelve información de atributos sobre archivos y directorios.
En particular, el primer carácter de ls -lsalida suele ser a do a -(guión). En el caso de duno, el listado es un directorio seguro.

El siguiente comando en una sola línea le dirá si la ISDIRvariable dada 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
ztank1013
fuente
+1, pero cuando ISDIR no existe, aparece un mensaje de error y un mensaje de diagnóstico.
ysap
5
file="foo" 
if [[ -e "$file" ]]; then echo "File Exists"; fi;
ajmartin
fuente
Una explicación estaría en orden ( editando su respuesta , no aquí en los comentarios).
Peter Mortensen
5

Si desea verificar si existe un directorio, independientemente de si es un directorio real o un enlace simbólico, use esto:

ls $DIR
if [ $? != 0 ]; then
        echo "Directory $DIR already exists!"
        exit 1;
fi
echo "Directory $DIR does not exist..."

Explicación: El comando "ls" da un error "ls: / x: No existe tal archivo o directorio" si el directorio o enlace simbólico no existe, y también establece el código de retorno, que puede recuperar mediante "$?", A no -nulo (normalmente "1"). Asegúrese de verificar el código de retorno directamente después de llamar "ls".

derFunk
fuente
3
Alternativamente, puede usar esta versión más corta:if ! ls $DIR 2>/dev/null; then echo "$DIR does not exist!"; fi
derFunk
5

(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 el lscomando; 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: no: no encontrado [No existe tal archivo o directorio]

Piyush Baijal
fuente
¿A qué se refiere "arriba"? ¿Las tres líneas de comando en esta respuesta o respuestas anteriores? (Responda editando su respuesta , no aquí en los comentarios. Gracias de antemano).
Peter Mortensen
4

Existen excelentes soluciones, pero en última instancia, cada script fallará si no está en el directorio correcto. Entonces código 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á con éxito solo si en el momento de la ejecución se encuentra en un directorio que tiene un subdirectorio en el que está buscando.

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 'encontrar' podría hacer el truco:

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 al buscar archivos / directorios. El único problema es que, si el directorio buscado no existe, el comando 'buscar' no imprimirá nada en la salida estándar (no es una solución elegante para mi gusto) y tendrá una salida cero. Tal vez alguien podría mejorar esto.

dromichaetes
fuente
13
Me ofendería si un programa revisara todo mi disco duro para encontrar un directorio en lugar de solo buscar educadamente en mi directorio de trabajo actual o usar la ruta absoluta que le doy. Lo que has sugerido podría ser bueno para una herramienta llamada locatepero no para nada más ...
sarnold