¿Cómo usar Bash para crear una carpeta si aún no existe?


179
#!/bin/bash
if [!-d /home/mlzboy/b2c2/shared/db]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;

Esto no parece funcionar. ¿Alguien puede ayudar?


44
¿Por qué tienes punto y coma?
ADTC

1
El ;token es un separador de comandos, al igual que la nueva línea. Como thenes un comando separado, se necesita el punto y coma anterior para poder escribirlo en la misma línea. Los punto mkdiry coma después y fison superflores.
Andreas Riedmüller

Respuestas:


278

Primero, en bash "[" es solo un comando, que espera la cadena "]" como último argumento, entonces el espacio en blanco antes del corchete de cierre (así como entre "!" Y "-d" que deben ser dos argumentos separados también) es importante:

if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
  mkdir -p /home/mlzboy/b2c2/shared/db;
fi

En segundo lugar, dado que está utilizando -p cambiar a mkdir, esta comprobación es inútil, porque esto es lo que hace en primer lugar. Solo escribe:

mkdir -p /home/mlzboy/b2c2/shared/db;

y eso es.


2
Nota: la -pbandera hace que se creen directorios principales si es necesario.
Danijel

13
Dios mío, nunca supe que "[" es un comando. Esto explica muchos de mis problemas ... Fácilmente lo más útil que he leído en StackOverflow.
Ben Kushigian el

1
¡Guauu! Saber que "[" es un comando en bash es una revelación. ¡Siento que muchos problemas con mis scripts de bash ahora están resueltos!
raluru

93

En realidad no hay necesidad de verificar si existe o no. Como ya desea crearlo si existe, solo mkdir lo hará

mkdir -p /home/mlzboy/b2c2/shared/db

2
Nota: la -pbandera hace que se creen directorios principales si es necesario.
Danijel

67

Simplemente haz:

mkdir /path/to/your/potentially/existing/folder

mkdir arrojará un error si la carpeta ya existe. Para ignorar los errores, escriba:

mkdir -p /path/to/your/potentially/existing/folder

No es necesario hacer ninguna comprobación ni nada por el estilo.


Para referencia:

-p, --parents no error if existing, make parent directories as needed http://man7.org/linux/man-pages/man1/mkdir.1.html


3
El argumento -pno ignora exactamente los errores: invoca un modo diferente donde se crean los componentes de ruta que no existen (y, por lo tanto, no es un error si sucede que es necesario crear cero). El comportamiento es diferente ya que creará componentes distintos al último, que pueden ser o no deseables.
BeeOnRope

23

Es necesario espacios dentro de las [y ]los soportes:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ] 
then
    mkdir -p /home/mlzboy/b2c2/shared/db
fi

18

De forma más limpia, explote la evaluación de acceso directo de los operadores lógicos de shell. El lado derecho del operador se ejecuta solo si el lado izquierdo es verdadero.

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db

11
mmh, no más limpio: solo más corto. Es difícil entender el significado de tal afirmación si la encuentras.
Davide Orazio Montersino

1
Me gusta esto, aunque el -pargumento hace innecesario el cheque. Todavía puede usarlo cuando no lo desee -p, es decir, cuando no desee que todos los directorios principales se creen automáticamente.
ADTC

3
En realidad, es aún más corto de escribir [ -d /path/to/dir ] || mkdir /path/to/dir... el lado derecho se ejecuta cuando el lado izquierdo es falso.
ADTC

4

Creo que deberías volver a formatear un poco tu código:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.