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.