Como usar o Bash para criar uma pasta, se ela ainda não existir?

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

Isso não parece funcionar. Alguém pode ajudar?

mlzboy
fonte
4
Por que você tem ponto e vírgula?
ADTC 13/04
1
O ;token é um separador de comandos, assim como a nova linha. Como thené um comando separado, o ponto-e-vírgula anterior é necessário para poder escrevê-lo na mesma linha. Os pontos mkdire vírgulas após e fisão supérfluos.
Andreas Riedmüller

Respostas:

278

Primeiro, no bash "[" é apenas um comando, que espera a string "]" como último argumento, portanto, o espaço em branco antes do colchete de fechamento (bem como entre "!" E "-d", que precisam ser dois argumentos separados também) é importante:

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

Segundo, como você está usando a opção -p mkdir, essa verificação é inútil, porque é o que acontece em primeiro lugar. Apenas escreva:

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

e é isso.

Maxim Sloyko
fonte
2
Nota: o -psinalizador faz com que qualquer diretório pai seja criado, se necessário.
Danijel
13
Meu Deus, eu nunca soube que "[" é um comando. Isso explica muitos dos meus problemas ... Facilmente a coisa mais útil que eu já li no StackOverflow.
Ben Kushigian
1
Uau! Saber que "[" é um comando no bash é algo que abre os olhos. Sinto que muitos problemas com meus scripts bash agora estão resolvidos!
Raluru
93

Na verdade, não há necessidade de verificar se existe ou não. Como você já deseja criá-lo, se existir, apenas o mkdir fará

mkdir -p /home/mlzboy/b2c2/shared/db
Kurumi
fonte
2
Nota: o -psinalizador faz com que qualquer diretório pai seja criado, se necessário.
Danijel
67

Simplesmente faça:

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

O mkdir lançará um erro se a pasta já existir. Para ignorar os erros, escreva:

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

Não há necessidade de fazer nenhuma verificação ou algo assim.


Para referência:

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

Automatico
fonte
3
O argumento -pnão ignora exatamente os erros: ele invoca um modo diferente em que todos os componentes do caminho que não existem são criados (e, portanto, não é um erro se acontecer que zero precise ser criado). O comportamento é diferente, pois cria componentes diferentes do último, que podem ou não ser desejáveis.
BeeOnRope
23

Você precisa de espaços dentro dos colchetes [e ]:

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

De maneira mais limpa, explore a avaliação de atalhos dos operadores lógicos do shell. O lado direito do operador é executado apenas se o lado esquerdo for verdadeiro.

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db
plesiv
fonte
11
mmh, não mais limpo: apenas mais curto. É difícil entender o significado dessa afirmação se você a encontrar.
Davide Orazio Montersino
1
Eu gosto disso, embora o -pargumento torne a verificação desnecessária. Você ainda pode usá-lo quando não quiser usá-lo -p, ou seja, quando não desejar que todos os diretórios pai sejam criados automaticamente.
ADTC 13/04
3
Na verdade, é ainda mais curto para escrever [ -d /path/to/dir ] || mkdir /path/to/dir. O lado direito é executado quando o lado esquerdo é falso.
ADTC
4

Eu acho que você deve reformatar um pouco o seu código:

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