verificar - Compruebe si existe un directorio en un script de shell




verificar si existe un archivo en unix (20)

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


Más características usando find

  • Compruebe 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 basadas en 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
    

  1. Un script simple para probar si el 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 comprobarán si el directorio está presente o no.

    $? si el último comando tiene éxito, devuelve "0"; Supongamos que tempdir ya está presente, entonces mkdir tempdir dará un error como el siguiente:

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


(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 encuentra un problema con uno de los enfoques mencionados anteriormente.

Con el comando ls ; los casos en que el directorio no existe - se muestra un mensaje de error

$ [[ ls -ld SAMPLE_DIR| grep ^d | wc -l ls -ld SAMPLE_DIR| grep ^d | wc -l ls -ld SAMPLE_DIR| grep ^d | wc -l -eq 1]] && echo existe || no existe -ksh: no: no encontrado [No existe tal archivo o directorio]


A continuación se puede utilizar la búsqueda,

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

Compruebe si el directorio existe, de lo contrario haga uno

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

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

El siguiente comando en una sola línea le dirá si la variable ISDIR 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:

    [[email protected] ~]$ ISDIR="$HOME/Music" 
    [[email protected] ~]$ ls -ld "$ISDIR"
    drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music
    [[email protected] ~]$ [[ $(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.

    [[email protected] ~]$ touch "empty file.txt"
    [[email protected] ~]$ ISDIR="$HOME/empty file.txt" 
    [[email protected] ~]$ [[ $(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

En realidad, debes 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 tiene que preocuparse por los espacios y los caracteres especiales siempre que use "${}" .

Tenga en cuenta que [[]] no es tan portátil como [] , pero como la mayoría de las personas trabaja 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 comandos :-p), el beneficio es mayor que el problema.


Escriba este código en el prom bash

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

Forma más corta:

[ -d "$DIR" ] && echo "Yes"


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

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

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 comprobar 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 , es posible que los comandos subsiguientes no funcionen según lo previsto si no tiene en cuenta que un enlace simbólico a un directorio también pasará esta verificación. Ej. 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, los enlaces simbólicos deben ser tratados de manera diferente, si los comandos subsiguientes 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 en particular de las comillas dobles utilizadas 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, es probable que la secuencia de comandos falle.


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 comando de test es el mismo que la expresión condicional [ (ver: man [ )], por lo que es portátil en los scripts de shell.

[ - Este es un sinónimo para la test incorporada, 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 de man [

Recuerde siempre envolver las variables entre comillas dobles cuando haga referencia a ellas en un script de bash. Los niños en 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 lujosos!)

Un día, uno de esos niños ejecutará su script con $DIRECTORY configurado en "My M0viez" y su script explotará. Tú no quieres eso. Así que usa esto.

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

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 a través de "$?", En non -nulo (normalmente "1"). Asegúrese de verificar el código de retorno directamente después de llamar "ls".


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 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 en el comando [[ builtin y el comando compuesto [[ .


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

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

NB: Cotizar variables es una buena práctica.


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

Esto no es completamente cierto ... Si desea ir a ese directorio, también necesita tener los derechos de ejecución en el directorio. Tal vez usted necesita tener derechos de escritura también.

Por lo que

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

if [ -d "$DIRECTORY" ]; then  
    # Here if $DIRECTORY exists  
fi




posix