Як зробити mkdir тільки якщо dir ще не існує?

Я пишу скрипт оболонки для запуску під керуванням KornShell (ksh) на AIX. Я хотів би використати команду mkdir для створення каталогу. Але каталог може вже існувати, в такому випадку я не хочу нічого робити. Тому я хочу або перевірити, що каталог не існує, або придушити помилку "File exists", яку mkdir видає при спробі створити існуючий каталог.

Є думки, як краще це зробити?

Рішення

Спробуйте mkdir -p:

mkdir -p foo

Зауважте, що це також створить будь-які проміжні каталоги, яких не існує, наприклад, проміжні каталоги,

mkdir -p foo/bar/baz

створить каталоги foo, foo/bar і foo/bar/baz, якщо їх не існує.

Деякі реалізації, такі як GNU mkdir, включають mkdir --parents як більш читабельний псевдонім, але це не зазначено у специфікації POSIX/Single Unix і недоступно на багатьох поширених платформах, таких як macOS, різні BSD і різні комерційні Unix, тому його слід уникати.

Якщо ви хочете уникнути помилки, коли батьківські каталоги не існують, і хочете створити каталог, якщо він не існує, ви можете спочатку тестувати на існування каталогу:

[ -d foo ] || mkdir foo
Коментарі (11)

Це повинно спрацювати:

$ mkdir -p dir

або:

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

яка створить каталог, якщо його не існує, але попередить вас, якщо ім'я каталогу, який ви намагаєтеся створити, вже використовується чимось іншим, ніж каталог.

Коментарі (3)

Використовуйте прапорець -p.

man mkdir
mkdir -p foo
Коментарі (0)