Comment utiliser Bash pour créer un dossier s'il n'existe pas déjà?

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

Cela ne semble pas fonctionner. Quelqu'un peut-il aider?

mlzboy
la source
4
Pourquoi avez-vous des points-virgules?
ADTC
1
Le ;jeton est un séparateur de commande, tout comme la nouvelle ligne. Comme thenc'est une commande distincte, le point-virgule précédent est nécessaire pour pouvoir l'écrire dans la même ligne. Les points-virgules après mkdiret fisont superflus.
Andreas Riedmüller

Réponses:

278

Premièrement, dans bash "[" est juste une commande, qui attend la chaîne "]" comme dernier argument, donc l'espace avant le crochet fermant (ainsi qu'entre "!" Et "-d" qui doivent être deux arguments séparés aussi) est important:

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

Deuxièmement, puisque vous utilisez -p switch to mkdir, cette vérification est inutile, car c'est ce qui fait en premier lieu. Ecrivez:

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

et c'est tout.

Maxim Sloyko
la source
2
Remarque: le -pdrapeau entraîne la création de tous les répertoires parents si nécessaire.
Danijel
13
Mon dieu, je n'ai jamais su que "[" était une commande. Cela explique tant de mes problèmes ... Facilement la chose la plus utile que j'ai jamais lue sur StackOverflow.
Ben Kushigian
1
Hou la la! Savoir que "[" est une commande dans bash est une telle révélation. J'ai l'impression que beaucoup de problèmes avec mes scripts bash sont maintenant résolus!
raluru
93

Il n'est en fait pas nécessaire de vérifier s'il existe ou non. Puisque vous voulez déjà le créer s'il existe, juste mkdir fera l'affaire

mkdir -p /home/mlzboy/b2c2/shared/db
Kurumi
la source
2
Remarque: le -pdrapeau entraîne la création de tous les répertoires parents si nécessaire.
Danijel
67

Faites simplement:

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

mkdir lancera une erreur si le dossier existe déjà. Pour ignorer les erreurs, écrivez:

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

Pas besoin de faire de vérification ou quoi que ce soit du genre.


Pour référence:

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

Automatico
la source
3
L'argument -pn'ignore pas exactement les erreurs: il appelle un mode différent dans lequel tous les composants de chemin qui n'existent pas sont créés (et par conséquent, ce n'est pas une erreur s'il se produit que zéro doit être créé). Le comportement est différent car il créera des composants autres que le dernier, ce qui peut être souhaitable ou non.
BeeOnRope
23

Vous avez besoin d'espaces entre les crochets [et ]:

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

De manière plus propre, exploitez l'évaluation des raccourcis des opérateurs logiques du shell. Le côté droit de l'opérateur est exécuté uniquement si le côté gauche est vrai.

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db
plesiv
la source
11
mmh, pas plus propre: juste plus court. Il est difficile de comprendre la signification d'une telle déclaration si vous la rencontrez.
Davide Orazio Montersino
1
J'aime cela, bien que l' -pargument rende la vérification inutile. Vous pouvez toujours l'utiliser lorsque vous ne souhaitez pas l'utiliser -p, c'est-à-dire lorsque vous ne souhaitez pas que tous les répertoires parents soient créés automatiquement.
ADTC
3
En fait, c'est encore plus court à écrire [ -d /path/to/dir ] || mkdir /path/to/dir. Le côté droit est exécuté lorsque le côté gauche est faux.
ADTC
4

Je pense que vous devriez reformater un peu votre code:

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