Wie erstelle ich mit Bash einen Ordner, falls dieser noch nicht existiert?

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

Das scheint nicht zu funktionieren. Kann jemand helfen?

mlzboy
quelle
4
Warum hast du Semikolons?
ADTC
1
Das ;Token ist ein Befehlstrennzeichen, ebenso wie Newline. Da thenes sich um einen separaten Befehl handelt, wird das vorhergehende Semikolon benötigt, um es in dieselbe Zeile schreiben zu können. Die Semikolons nach mkdirund fisind überflüssig.
Andreas Riedmüller

Antworten:

277

Erstens ist "[" in bash nur ein Befehl, der die Zeichenfolge "]" als letztes Argument erwartet, also das Leerzeichen vor der schließenden Klammer (sowie zwischen "!" Und "-d", die zwei separate Argumente sein müssen auch) ist wichtig:

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

Zweitens ist mkdirdiese Prüfung nutzlos , da Sie den Schalter -p verwenden, um zu wechseln , da dies in erster Linie der Fall ist. Einfach schreiben:

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

und das ist es.

Maxim Sloyko
quelle
2
Hinweis: Mit dem -pFlag werden bei Bedarf übergeordnete Verzeichnisse erstellt.
Danijel
13
Mein Gott, ich habe nie gewusst, dass "[" ein Befehl ist. Dies erklärt so viele meiner Probleme ... Das Nützlichste, was ich je auf StackOverflow gelesen habe.
Ben Kushigian
1
Beeindruckend! Zu wissen, dass "[" ein Befehl in Bash ist, ist ein solcher Augenöffner. Ich habe das Gefühl, dass viele Probleme mit meinen Bash-Skripten jetzt behoben sind!
Raluru
93

Es besteht eigentlich keine Notwendigkeit zu prüfen, ob es existiert oder nicht. Da Sie es bereits erstellen möchten, wenn es vorhanden ist, reicht nur mkdir aus

mkdir -p /home/mlzboy/b2c2/shared/db
kurumi
quelle
2
Hinweis: Mit dem -pFlag werden bei Bedarf übergeordnete Verzeichnisse erstellt.
Danijel
67

Einfach machen:

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

mkdir gibt einen Fehler aus, wenn der Ordner bereits vorhanden ist. Um die Fehler zu ignorieren, schreiben Sie:

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

Keine Notwendigkeit, irgendwelche Überprüfungen oder ähnliches durchzuführen.


Als Referenz:

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

Automatico
quelle
3
Das Argument -pignoriert Fehler nicht genau: Es ruft einen anderen Modus auf, in dem nicht vorhandene Pfadkomponenten erstellt werden (und daher ist es kein Fehler, wenn die Null erstellt werden muss). Das Verhalten ist anders, da andere als die letzte Komponenten erstellt werden, was wünschenswert sein kann oder nicht.
BeeOnRope
23

Sie benötigen Leerzeichen in [und ]Klammern:

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

Nutzen Sie die Verknüpfungsbewertung von logischen Shell-Operatoren auf sauberere Weise. Die rechte Seite des Operators wird nur ausgeführt, wenn die linke Seite wahr ist.

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db
plesiv
quelle
11
mmh, nicht sauberer: nur kürzer. Es ist schwierig, die Bedeutung einer solchen Aussage zu verstehen, wenn Sie darauf stoßen.
Davide Orazio Montersino
1
Ich mag das, obwohl das -pArgument die Überprüfung unnötig macht. Sie können es weiterhin verwenden, wenn Sie es nicht verwenden möchten -p. In diesem Fall möchten Sie nicht, dass alle übergeordneten Verzeichnisse automatisch erstellt werden.
ADTC
3
Tatsächlich ist das Schreiben sogar noch kürzer [ -d /path/to/dir ] || mkdir /path/to/dir. Die rechte Seite wird ausgeführt, wenn die linke Seite falsch ist.
ADTC
4

Ich denke, Sie sollten Ihren Code ein wenig neu formatieren:

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