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?


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.


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

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


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

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

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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.