Как использовать Bash для создания папки, если она еще не существует?

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

Это не похоже на работу. Кто-нибудь может помочь?

mlzboy
источник
4
Почему у вас точка с запятой?
ADTC
1
;Маркер представляет собой разделитель команд, так это перенос строки. Как thenотдельная команда, предыдущая точка с запятой необходима, чтобы иметь возможность записать ее в той же строке. Точки с запятой после mkdirи fiявляются лишними.
Андреас Ридмюллер

Ответы:

279

Во-первых, в bash «[» - это просто команда, которая ожидает строку «]» в качестве последнего аргумента, поэтому пробел перед закрывающей скобкой (а также между «!» И «-d», которые должны быть двумя отдельными аргументами тоже) важно

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

Во-вторых, поскольку вы используете ключ -p mkdir, эта проверка бесполезна, потому что именно это и происходит в первую очередь. Просто пиши:

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

и это все.

Максим Слойко
источник
2
Примечание: -pфлаг заставляет любые родительские каталоги быть созданными при необходимости.
Даниэль
13
Боже мой, я никогда не знал, что «[» - это команда. Это объясняет многие из моих проблем ... Самая полезная вещь, которую я когда-либо читал в StackOverflow.
Бен Кушиган
1
Вот Это Да! Знание того, что «[» - это команда в bash, является таким откровением. Я чувствую, что многие проблемы с моими bash-скриптами теперь решены!
raluru
93

На самом деле нет необходимости проверять, существует ли он или нет. Так как вы уже хотите создать его, если он существует, просто mkdir сделает

mkdir -p /home/mlzboy/b2c2/shared/db
Каруми
источник
2
Примечание: -pфлаг заставляет любые родительские каталоги быть созданными при необходимости.
Даниэль
67

Просто сделайте:

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

mkdir выдаст ошибку, если папка уже существует. Чтобы игнорировать ошибки, напишите:

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

Нет необходимости делать какие-либо проверки или что-то подобное.


Для справки:

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

Automatico
источник
3
Аргумент -pне совсем игнорирует ошибки: он вызывает другой режим, в котором создаются любые несуществующие компоненты пути (и, следовательно, это не ошибка, если случается, что нужно создать ноль). Поведение отличается, так как это создаст компоненты, отличные от последнего, что может быть или не желательно.
BeeOnRope
23

Вам нужны пробелы внутри [и ]скобки:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ] 
then
    mkdir -p /home/mlzboy/b2c2/shared/db
fi
кендырь
источник
18

Более понятный способ - использовать ускоренную оценку логических операторов оболочки. Правая сторона оператора выполняется только в том случае, если левая сторона истинна.

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db
plesiv
источник
11
ммх, не чище: просто короче. Трудно понять смысл такого заявления, если вы сталкиваетесь с ним.
Давиде Орацио Монтерсино
1
Мне это нравится, хотя -pаргумент делает проверку ненужной. Вы все еще можете использовать его, когда вы не хотите его использовать -p, то есть когда вы не хотите, чтобы все родительские каталоги создавались автоматически.
ADTC
3
На самом деле это еще короче, чтобы написать [ -d /path/to/dir ] || mkdir /path/to/dir.. правая сторона выполняется, когда левая сторона ложна.
ADTC
4

Я думаю, вам следует немного переформатировать код:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;
плющ
источник