Як використовувати Bash для створення папки, якщо вона ще не існує?


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

Це, здається, не працює. Хтось може допомогти?


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


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

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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.