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?


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.


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

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


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

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

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;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.