Як використовувати 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.