208 votes

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

#!/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 nous aider ?

4 votes

Pourquoi des points-virgules ?

1 votes

Le site ; Le jeton est un séparateur de commande, tout comme la nouvelle ligne. Comme then est une commande distincte, le point-virgule précédent est nécessaire pour pouvoir l'écrire sur la même ligne. Les points-virgules après mkdir y fi sont superflus.

320voto

Maxim Sloyko Points 4091

Tout d'abord, dans Bash [ est juste une commande, qui attend une chaîne de caractères ] en tant que dernier argument, de sorte que l'espace avant le crochet fermant (ainsi qu'entre les mots ! y -d qui doivent aussi être deux arguments distincts) est important :

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

Deuxièmement, puisque vous utilisez -p pour mkdir ce contrôle est inutile, car c'est ce qu'il fait. fait en premier lieu. Ecris juste :

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

et c'est tout.

2 votes

Remarque : le -p fait en sorte que les répertoires parents soient créés si nécessaire.

30 votes

Mon Dieu, je ne savais pas que "[" était une commande. Cela explique tellement de mes problèmes... Facilement la chose la plus utile que j'ai jamais lu sur StackOverflow.

4 votes

Wow ! Savoir que "[" est une commande dans bash est une telle révélation. Je sens que beaucoup de problèmes avec mes scripts de bash sont maintenant résolus !

104voto

kurumi Points 10096

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, mkdir suffira.

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

3 votes

Remarque : le -p fait en sorte que les répertoires parents soient créés si nécessaire.

85voto

Cort3z Points 1657

Il suffit de le faire :

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

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

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

Il n'y a pas besoin de faire de vérification ou autre.


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

6 votes

L'argument -p n'ignore pas exactement les erreurs : il invoque un mode différent où tous les composants du chemin qui n'existent pas sont créés (et donc ce n'est pas une erreur s'il arrive qu'aucun ne doive être créé). Le comportement est différent puisqu'il créera des composants autres que le dernier, ce qui peut ou non être souhaitable.

28voto

dogbane Points 85749

Vous avez besoin d'espaces à l'intérieur du [ y ] des crochets :

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

20voto

zplesivcak Points 2633

Plus propre, exploiter l'évaluation raccourcie des opérateurs logiques du shell. Le côté droit de l'opérateur n'est exécuté que si le côté gauche est vrai.

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

12 votes

Mmh, pas plus propre : juste plus court. Il est difficile de comprendre le sens d'une telle affirmation si vous la rencontrez.

1 votes

J'aime ça, bien que le -p rend la vérification inutile. Vous pouvez tout de même l'utiliser lorsque vous ne voulez pas utiliser -p c'est alors que vous ne veulent pas tous les répertoires parents à créer automatiquement.

3 votes

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X