¿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?

mlzboy
fuente
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.

Maxim Sloyko
fuente
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
Kurumi
fuente
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

Automatico
fuente
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
dogbane
fuente
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
plesiv
fuente
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;
hiedra
fuente