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.