Come usare Bash per creare una cartella se non esiste già?


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

Questo non sembra funzionare. Qualcuno può aiutare?


4
Perché hai un punto e virgola?
ADTC

1
Il ;token è un separatore di comandi, quindi è newline. Poiché thenè un comando separato, è necessario il punto e virgola precedente per poterlo scrivere nella stessa riga. I punti mkdire virgola dopo e fisono superflous.
Andreas Riedmüller,

Risposte:


278

Innanzitutto, in bash "[" è solo un comando, che prevede la stringa "]" come ultimo argomento, quindi lo spazio bianco prima della parentesi quadra di chiusura (nonché tra "!" E "-d" che devono essere due argomenti separati anche) è importante:

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

In secondo luogo, poiché si utilizza -p passare a mkdir, questo controllo è inutile, perché questo è ciò che fa in primo luogo. Scrivi e basta:

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

e questo è tutto.


2
Nota: il -pflag provoca la creazione di eventuali directory principali, se necessario.
Danijel,

13
Mio Dio, non ho mai saputo che "[" è un comando. Questo spiega molti dei miei problemi ... Facilmente la cosa più utile che abbia mai letto su StackOverflow.
Ben Kushigian,

1
Wow! Sapere che "[" è un comando in bash è tale da aprire gli occhi. Sento che molti problemi con i miei script bash ora sono risolti!
raluru,

93

In realtà non è necessario verificare se esiste o no. Dal momento che vuoi già crearlo se esiste, lo farà solo mkdir

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

2
Nota: il -pflag provoca la creazione di eventuali directory principali, se necessario.
Danijel,

67

Fai semplicemente:

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

mkdir genererà un errore se la cartella esiste già. Per ignorare gli errori scrivi:

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

Non c'è bisogno di fare alcun controllo o qualcosa del genere.


Per riferimento:

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


3
L'argomento -pnon ignora esattamente gli errori: invoca una modalità diversa in cui vengono creati tutti i componenti del percorso che non esistono (e quindi non è un errore se accade che è necessario creare zero). Il comportamento è diverso poiché creerà componenti diversi dall'ultimo, il che potrebbe essere desiderabile o meno.
BeeOnRope,

23

Sono necessari spazi all'interno delle parentesi [e ]:

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

18

Modo più pulito, sfruttare la valutazione dei collegamenti degli operatori logici della shell. Il lato destro dell'operatore viene eseguito solo se il lato sinistro è vero.

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

11
mmh, non più pulito: solo più corto. È difficile comprendere il significato di tale affermazione se la si incontra.
Davide Orazio Montersino,

1
Mi piace, anche se l' -pargomento rende superfluo il controllo. Puoi ancora usarlo quando non vuoi usarlo -p, cioè quando non vuoi che tutte le directory principali vengano create automaticamente.
ADTC

3
In realtà è ancora più breve da scrivere [ -d /path/to/dir ] || mkdir /path/to/dir.. il lato destro viene eseguito quando il lato sinistro è falso.
ADTC

4

Penso che dovresti riformattare un po 'il tuo codice:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.