← Весь справочник

mkdir

Создание каталогов — сразу с родителями и нужными правами

mkdir создаёт каталоги. С -p создаёт всю цепочку родителей и не ругается, если каталог уже есть, — поэтому в скриптах почти всегда пишут mkdir -p. Пару ему составляет rmdir — удаление пустых каталогов. В песочнице — GNU coreutils 9.4.

Синтаксис

mkdir [опции] каталог…
rmdir [опции] пустой_каталог…

Код возврата: 0 — всё создано (с -p — или уже было), 1 — ошибка: каталог существует (без -p), нет родителя, нет прав, на месте пути лежит файл.

Опции mkdir

ОпцияЧто делает
-pсоздать недостающих родителей; если каталог уже есть — не ошибка
-m режимправа нового каталога, как в chmod: -m 700, -m u=rwx,g=rx,o=. Задаются точно, umask не применяется
-vпечатать каждый созданный каталог: mkdir: created directory 'a/b'

Без -m права нового каталога — 777 минус umask (при umask 022 — 755, drwxr-xr-x).

Опции rmdir

ОпцияЧто делает
-pпосле каталога удалить и его родителей, пока они пустые: rmdir -p a/b/c → c, b, a
-vпечатать каждое удаление
--ignore-fail-on-non-emptyне считать ошибкой непустой каталог — молча оставить его

Примеры

# цепочка каталогов одной командой
mkdir -p /srv/app/releases/v1

# несколько каталогов через подстановку фигурных скобок bash
mkdir -p project/{src,tests,docs}
mkdir -p logs/{2024,2025}/{01..12}

# приватный каталог: доступ только владельцу
mkdir -m 700 ~/.secrets

# видеть, что реально создаётся
mkdir -pv /srv/data/cache

# в скрипте: создать, только если нет, и выйти при ошибке
mkdir -p "$OUT_DIR" || exit 1

# удалить пустую ветку каталогов
rmdir -p logs/2024/01

Подводные камни

  • -m вместе с -p действует только на последний каталог. mkdir -p -m 700 x/y/z создаст x и x/y с правами по umask (755), и только z — с 700.
  • -p не проверяет, что каталог твой и с нужными правами: если он уже был, mkdir -p -m 700 его права не тронет. Нужны точные права — делай chmod отдельно.
  • Файл вместо каталога. Если на пути лежит обычный файл, даже -p упадёт: «cannot create directory 'fi': Not a directory».
  • Фигурные скобки — это bash, а не mkdir. В sh (dash) mkdir {a,b} создаст один каталог с именем {a,b}. Пробел внутри ({a, b}) ломает подстановку и в bash.
  • rmdir не удаляет непустые каталоги — «Directory not empty». Это защита; для дерева с содержимым — rm -r.
  • rmdir -p упирается в первого непустого родителя и возвращает 1, хотя нижние каталоги уже удалены. В скрипте добавляй --ignore-fail-on-non-empty.

См. также

rm · chmod · umask · chown · mktemp · touch · cp