Jak użyć Bash, aby utworzyć folder, jeśli jeszcze nie istnieje?

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

To nie działa. Czy ktoś może pomóc?

mlzboy
źródło
4
Dlaczego masz średniki?
ADTC
1
;Znacznik jest separator polecenia tak jest nowej linii. Ponieważ thenjest to osobne polecenie, poprzedzający średnik jest potrzebny, aby móc zapisać go w tym samym wierszu. Średniki po mkdiri fisą zbędne.
Andreas Riedmüller

Odpowiedzi:

279

Po pierwsze, w bash "[" jest tylko poleceniem, które oczekuje napisu "]" jako ostatniego argumentu, więc spacja przed nawiasem zamykającym (jak również pomiędzy "!" I "-d", które muszą być dwoma oddzielnymi argumentami też) jest ważne:

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

Po drugie, ponieważ używasz przełącznika -p do mkdir, to sprawdzenie jest bezużyteczne, ponieważ właśnie to robi w pierwszej kolejności. Tylko napisz:

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

i to wszystko.

Maxim Sloyko
źródło
2
Uwaga: -pflaga powoduje, że w razie potrzeby tworzone są katalogi nadrzędne.
Danijel
13
Mój Boże, nigdy nie wiedziałem, że „[” jest rozkazem. To wyjaśnia tak wiele moich problemów ... Z pewnością najbardziej użyteczna rzecz, jaką kiedykolwiek czytałem w StackOverflow.
Ben Kushigian
1
Łał! Świadomość, że "[" jest komendą w bash, otwiera oczy. Czuję, że wiele problemów z moimi skryptami bash zostało rozwiązanych!
raluru
93

W rzeczywistości nie ma potrzeby sprawdzania, czy istnieje, czy nie. Ponieważ już chcesz go utworzyć, jeśli istnieje, wystarczy mkdir

mkdir -p /home/mlzboy/b2c2/shared/db
kurumi
źródło
2
Uwaga: -pflaga powoduje, że w razie potrzeby tworzone są katalogi nadrzędne.
Danijel
67

Po prostu zrób:

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

mkdir zgłosi błąd, jeśli folder już istnieje. Aby zignorować błędy napisz:

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

Nie ma potrzeby sprawdzania ani niczego w tym rodzaju.


Na przykład:

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

Automatico
źródło
3
Argument -pnie ignoruje dokładnie błędów: wywołuje inny tryb, w którym tworzone są dowolne składniki ścieżki, które nie istnieją (a zatem nie jest błędem, jeśli zdarzy się, że trzeba utworzyć zero). Zachowanie jest inne, ponieważ utworzy komponenty inne niż ostatni, co może być pożądane lub nie.
BeeOnRope
23

Potrzebujesz spacji w nawiasach [i ]:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ] 
then
    mkdir -p /home/mlzboy/b2c2/shared/db
fi
dogbane
źródło
18

Czystszy sposób, wykorzystanie skrótów do oceny operatorów logicznych powłoki. Prawa strona operatora jest wykonywana tylko wtedy, gdy lewa strona jest prawdą.

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db
plesiv
źródło
11
mmh, nie czyściej: tylko krócej. Trudno zrozumieć znaczenie takiego stwierdzenia, jeśli się z nim spotkasz.
Davide Orazio Montersino,
1
Podoba mi się to, chociaż -pargument sprawia, że ​​sprawdzanie jest niepotrzebne. Nadal możesz go używać, gdy nie chcesz go używać -p, to znaczy, gdy nie chcesz, aby wszystkie katalogi nadrzędne były tworzone automatycznie.
ADTC
3
Właściwie pisanie jest jeszcze krótsze [ -d /path/to/dir ] || mkdir /path/to/dir... prawa strona jest wykonywana, gdy lewa strona jest fałszywa.
ADTC
4

Myślę, że powinieneś nieco ponownie sformatować swój kod:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;
bluszcz
źródło