mkdir расшифровывается как make directory. Команда делает ровно одно — создаёт директории. Но несколько флагов и нюансов с правами доступа делают её существенно полезнее, чем кажется на первый взгляд.
Синтаксис
mkdir [опции] имя_директории
Создать одну директорию в текущем каталоге:
mkdir logs
Создать по абсолютному пути:
mkdir /var/www/myapp
Флаг -p: создание вложенных директорий
Самый важный флаг. Без него mkdir не создаст директорию, если родительский каталог не существует — выдаст ошибку.
mkdir projects/backend/api
Если projects или backend не существуют — команда упадёт с ошибкой No such file or directory.
С флагом -p создаётся вся цепочка сразу:
mkdir -p projects/backend/api
Если промежуточные директории уже есть — ошибки не будет, команда просто продолжит. Поэтому -p безопасно использовать в скриптах, не проверяя заранее, существует ли путь.
Создание нескольких независимых путей одной командой:
mkdir -p /opt/myapp/{logs,config,data,tmp}
Фигурные скобки разворачивает bash, а не mkdir — это называется brace expansion. Результат: четыре директории внутри /opt/myapp/ одной командой.
Флаг -m: права доступа при создании
По умолчанию mkdir создаёт директорию с правами 755 (rwxr-xr-x) — владелец может всё, остальные только читают и переходят. Это определяется значением umask в системе.
Флаг -m задаёт права сразу при создании, не требуя отдельного chmod:
mkdir -m 700 private
Директория private будет доступна только владельцу — никто другой не сможет ни прочитать содержимое, ни войти.
mkdir -m 755 public_html
Стандартные права для веб-директорий: владелец пишет, остальные только читают.
mkdir -m 1777 shared
Sticky bit (1 в начале) — классические права для общих директорий вроде /tmp. Каждый может создавать файлы, но удалить чужой не может.
Флаг -m не действует на промежуточные директории, созданные вместе с -p — они получат стандартные права по umask. Права будут применены только к конечной директории.
Создание нескольких директорий
Передать несколько имён через пробел — mkdir создаст все сразу:
mkdir css js images fonts
С абсолютными путями:
mkdir /var/log/nginx /var/log/php /var/log/mysql
С brace expansion для создания вложенной структуры:
mkdir -p project/{src,dist,tests,docs}
Результат — четыре директории внутри project/. Можно делать и вложеннее:
mkdir -p project/{src/{components,utils,hooks},dist,tests/{unit,integration}}
Флаг -v: подробный вывод
По умолчанию mkdir работает молча. Флаг -v выводит сообщение о каждой созданной директории:
mkdir -pv /opt/app/{logs,config,data}
Вывод:
mkdir: created directory '/opt/app'
mkdir: created directory '/opt/app/logs'
mkdir: created directory '/opt/app/config'
mkdir: created directory '/opt/app/data'
Полезно в скриптах, когда нужно видеть, что именно было создано.
Права доступа и владелец
mkdir создаёт директорию от имени текущего пользователя — он становится её владельцем. Для создания директорий в системных путях нужны права root:
sudo mkdir /etc/myapp
После создания директорию часто нужно передать другому пользователю или сервису:
sudo mkdir /var/www/myapp
sudo chown www-data:www-data /var/www/myapp
Или создать и сразу задать права одной цепочкой:
sudo mkdir -m 750 /etc/myapp && sudo chown root:myapp /etc/myapp
Типичные ошибки
mkdir: cannot create directory 'path': No such file or directory Промежуточные директории не существуют. Решение: добавить флаг -p.
mkdir: cannot create directory 'path': File exists Директория уже есть. С флагом -p такой ошибки не будет — команда проигнорирует существующие пути.
mkdir: cannot create directory 'path': Permission denied Нет прав на запись в родительскую директорию. Нужно либо sudo, либо проверить, в правильном ли месте создаётся директория.
Полезные комбинации
Создать директорию и сразу перейти в неё
mkdir -p /opt/myapp && cd /opt/myapp
&& выполняет cd только если mkdir завершился успешно.
Создать временную директорию с уникальным именем
Для временных данных лучше mktemp — он гарантирует уникальное имя:
tmpdir=$(mktemp -d)
echo "Временная директория: $tmpdir"
Создать структуру проекта одной командой
mkdir -p myproject/{src/{models,controllers,views},tests,config,logs,docs}
Проверить, существует ли директория, перед созданием
В скриптах стандартный паттерн:
[ -d /opt/myapp ] || mkdir -p /opt/myapp
Или через -p, который сам обрабатывает существующие пути.
Шпаргалка
| Команда | Что делает |
|---|---|
mkdir dir |
Создать директорию в текущем каталоге |
mkdir /path/to/dir |
Создать по абсолютному пути |
mkdir -p a/b/c |
Создать всю вложенную цепочку |
mkdir dir1 dir2 dir3 |
Создать несколько директорий |
mkdir -p project/{a,b,c} |
Создать несколько вложенных сразу |
mkdir -m 700 dir |
Создать с конкретными правами |
mkdir -pv path |
Создать с подробным выводом |
sudo mkdir /etc/dir |
Создать системную директорию |
Итог
Для большинства задач хватает mkdir -p — создаёт весь путь сразу и не падает с ошибкой если путь уже существует. Флаг -m экономит отдельный вызов chmod, когда права важны с момента создания.
Всё это работает одинаково на любом Linux-сервере. Подобрать VPS можно в каталоге PQ.Hosting.