
Ключ -p у команды mkdir используется для создания полного пути каталогов без предварительной проверки их наличия. При указании вложенного пути система последовательно обрабатывает каждый уровень, создавая отсутствующие директории сверху вниз. Это позволяет одной командой подготовить структуру каталогов любой глубины, даже если ни один элемент пути ранее не существовал.
При создании директорий с помощью -p права доступа назначаются согласно значению umask текущего пользователя. Промежуточные каталоги получают стандартные разрешения, а не наследуют их от родительских директорий. Это необходимо учитывать при подготовке путей для веб-серверов, журналов приложений и временных файлов, где доступ может быть ограничен пользователями или сервисами.
На практике mkdir -p применяется в Bash-скриптах, systemd-юнитах, CI/CD-пайплайнах и контейнерных сборках. Команда упрощает логику сценариев, устраняет избыточные проверки и снижает вероятность сбоев, связанных с отсутствием каталогов в файловой системе.
Mkdir -p: что делает команда в Linux

Команда mkdir -p создаёт каталоги вместе со всеми отсутствующими родительскими директориями, указанными в пути. В отличие от стандартного поведения mkdir, система не прерывает выполнение, если промежуточные уровни не существуют. Каждый элемент пути обрабатывается последовательно, начиная с корня или текущего каталога.
При наличии уже существующих каталогов команда не возвращает ошибку и не изменяет их состояние. Это делает mkdir -p безопасной для повторного выполнения, включая сценарии инициализации окружений, деплой приложений и автоматическую настройку серверов. Код возврата остаётся равным 0, если не возникло проблем с правами доступа или файловой системой.
Все создаваемые каталоги получают права на основе текущего значения umask. Промежуточные директории не наследуют разрешения от родительских каталогов, что важно учитывать при создании путей для сервисов, работающих от других пользователей. Для явного задания прав рекомендуется использовать дополнительную команду chmod после создания структуры.
Ниже приведено сравнение поведения команды с ключом -p и без него при типовых сценариях использования.
| Ситуация | mkdir | mkdir -p |
|---|---|---|
| Отсутствует родительский каталог | Ошибка: No such file or directory | Каталоги создаются последовательно |
| Каталог уже существует | Ошибка: File exists | Команда завершается без сообщений |
| Повторный запуск скрипта | Требуются проверки | Дополнительная логика не нужна |
Что делает ключ -p при создании цепочки каталогов

Ключ -p у команды mkdir указывает системе создавать всю цепочку каталогов, заданную в пути, а не только конечную директорию. Если один или несколько промежуточных каталогов отсутствуют, они будут созданы автоматически в правильном порядке. Например, при выполнении mkdir -p /opt/app/data/cache система последовательно создаст /opt, /opt/app, /opt/app/data и /opt/app/data/cache, если они не существуют.
Во время обработки пути команда проверяет каждый уровень на наличие и тип объекта. Если на месте ожидаемого каталога находится файл или символьная ссылка на файл, выполнение прекращается с ошибкой. Это поведение защищает файловую систему от некорректной перезаписи и позволяет заранее выявить конфликт структуры каталогов.
Ключ -p также подавляет сообщение об ошибке при попытке создать каталог, который уже существует. Команда не изменяет его права доступа, владельца или временные метки. Такое поведение позволяет использовать mkdir -p в скриптах без дополнительных проверок через test -d или [ -d ].
При создании цепочки каталогов все новые директории получают права, рассчитанные на основе текущего значения umask. Если требуется задать разрешения заранее, рекомендуется выполнять chmod или install -d после завершения команды. Это особенно важно при подготовке каталогов для демонов, контейнеров и сервисов с ограниченными привилегиями.
Создание вложенных каталогов за одну команду
Команда mkdir -p позволяет создавать вложенные каталоги одной инструкцией без предварительной подготовки структуры. Вместо последовательного выполнения нескольких команд система обрабатывает указанный путь целиком и формирует недостающие уровни автоматически.
Типовой сценарий использования выглядит следующим образом:
- задаётся полный путь до конечного каталога;
- проверяется наличие каждого уровня пути;
- отсутствующие директории создаются по порядку;
- существующие каталоги пропускаются без ошибок.
Такой подход особенно полезен при работе с проектами, где требуется заранее подготовить структуру каталогов для конфигураций, логов и данных приложения. Пример команды:
- mkdir -p ~/projects/app/{config,logs,tmp}
В этом случае одновременно создаются несколько вложенных каталогов, а оболочка Bash разворачивает фигурные скобки до выполнения команды. Это сокращает количество строк в скриптах и снижает риск опечаток.
При автоматизации рекомендуется соблюдать следующие правила:
- указывать абсолютные пути для системных каталогов;
- проверять права доступа пользователя до выполнения команды;
- избегать создания каталогов в корне файловой системы без необходимости;
- задавать разрешения отдельно, если они отличаются от значений umask.
Поведение mkdir -p при уже существующих каталогах

Важно учитывать, что mkdir -p не обновляет права доступа, владельца и группу у существующих каталогов. Если директория была создана ранее с другими разрешениями, команда не приведёт их к ожидаемому состоянию. В таких случаях необходимо отдельно использовать chmod или chown после выполнения команды.
Если в процессе обработки пути обнаруживается объект, который не является каталогом, выполнение завершается с ошибкой. Например, если на месте предполагаемой директории находится файл, символьная ссылка на файл или сокет, команда не сможет продолжить создание вложенных уровней. Это поведение предотвращает нарушение целостности файловой системы.
Для сценариев автоматизации рекомендуется учитывать код возврата команды. При отсутствии ошибок он равен 0, даже если все каталоги уже существовали. Ненулевой код указывает на проблемы с правами доступа, повреждение файловой системы или конфликт типов объектов, что упрощает диагностику в логах скриптов и сервисов.
Как mkdir -p работает с правами доступа
При создании каталогов с помощью mkdir -p права доступа назначаются на основе стандартных разрешений, уменьшенных текущим значением umask пользователя. Базовое значение для каталогов составляет 777, из которого вычитаются биты, указанные в umask. Например, при umask 022 новые каталоги будут созданы с правами 755.
Каждый создаваемый уровень пути обрабатывается отдельно, поэтому промежуточные каталоги получают те же разрешения, что и конечный каталог. Команда не анализирует права родительских директорий и не копирует их параметры доступа. Это важно учитывать при подготовке путей для сервисов, работающих под отдельными пользователями или группами.
Если каталог уже существует, mkdir -p не изменяет его права доступа, владельца и группу. Даже при наличии отличий от ожидаемой конфигурации команда завершится без ошибок. Для приведения разрешений к нужному состоянию необходимо явно применять chmod и chown после создания структуры.
При недостаточных правах на создание хотя бы одного уровня пути команда завершится с ошибкой и ненулевым кодом возврата. Например, попытка создать каталог внутри директории без права записи приведёт к прерыванию выполнения. В скриптах рекомендуется обрабатывать код возврата и заранее проверять доступ через test -w или запускать команду от имени пользователя с нужными привилегиями.
Типичные ошибки и сообщения при использовании mkdir -p

Несмотря на устойчивое поведение, mkdir -p может завершаться с ошибками при нарушении условий доступа или структуры файловой системы. Наиболее распространённая ситуация – сообщение Permission denied, возникающее при попытке создать каталог в директории без права записи. В таких случаях необходимо проверить владельца и права родительского каталога или выполнить команду от имени пользователя с расширенными привилегиями.
Ошибка No such file or directory появляется, если часть пути указывает на объект, который не является каталогом. Например, когда промежуточный элемент пути представляет собой обычный файл. Команда не может продолжить создание цепочки и корректно завершает выполнение с ненулевым кодом возврата.
Сообщение File exists при использовании ключа -p встречается редко и указывает на конфликт типов объектов. Такая ситуация возникает, если на месте ожидаемого каталога находится файл, сокет или символьная ссылка на файл. Для устранения ошибки требуется изменить путь или удалить конфликтующий объект.
При работе в автоматизированных сценариях важно анализировать код возврата команды. Нулевое значение означает успешное выполнение, даже если каталоги уже существовали. Любое ненулевое значение сигнализирует о проблемах с правами, повреждённой файловой системой или некорректной структурой пути, что позволяет точно определить причину сбоя без разбора текстовых сообщений.
Применение mkdir -p в shell-скриптах
В shell-скриптах команда mkdir -p применяется для подготовки файловой структуры перед выполнением основных операций. Она позволяет создавать каталоги для логов, временных файлов, конфигураций и данных без дополнительных проверок существования пути. Это упрощает код сценария и снижает вероятность аварийного завершения при повторных запусках.
Частая практика – размещать вызов mkdir -p в начале скрипта, сразу после определения переменных окружения. Например, при использовании переменных пути команда гарантирует, что каталог будет создан независимо от текущего состояния системы. При этом важно использовать кавычки для путей с пробелами и специальными символами.
Для обработки ошибок рекомендуется проверять код возврата команды через $? или применять строгий режим выполнения с set -e. Это позволяет немедленно остановить скрипт при невозможности создать каталог из-за отсутствия прав или конфликтов типов объектов в пути.
В сценариях, запускаемых от имени сервисных пользователей, следует учитывать значение umask, так как именно оно определяет права создаваемых директорий. При необходимости доступов для нескольких пользователей или процессов разрешения нужно корректировать явно, используя chmod после создания структуры каталогов.
Отличия mkdir -p от mkdir без ключей

Команда mkdir без ключей предназначена для создания одного каталога и требует, чтобы все родительские директории уже существовали. При указании вложенного пути выполнение завершается ошибкой, если хотя бы один уровень отсутствует. В отличие от этого, mkdir -p обрабатывает весь путь целиком и создаёт недостающие каталоги автоматически.
Ключевые различия поведения можно выделить по следующим пунктам:
- обычный mkdir возвращает ошибку при отсутствии родительского каталога;
- mkdir -p создаёт цепочку каталогов без дополнительных проверок;
- без ключей команда завершится с ошибкой, если каталог уже существует;
- с -p существующие директории игнорируются без сообщений.
Различается и подход к использованию в автоматизации. Для стандартного mkdir требуется предварительная проверка через test -d или условные конструкции. При использовании -p дополнительная логика не нужна, что упрощает сценарии и делает их устойчивыми к повторным запускам.
Практическая рекомендация заключается в выборе команды в зависимости от контекста:
- использовать mkdir без ключей, если создание каталога должно завершиться ошибкой при отклонении от ожидаемого состояния;
- применять mkdir -p для подготовки структуры каталогов в скриптах, контейнерах и сервисах;
- отдельно задавать права доступа, если они критичны для работы приложения.
Вопрос-ответ:
Зачем использовать mkdir -p, если каталоги уже могут существовать?
Команда mkdir -p завершает выполнение без ошибки, если указанные каталоги уже присутствуют в файловой системе. Это удобно для скриптов и автоматических задач, которые запускаются несколько раз. Отсутствует необходимость добавлять проверки существования директорий, а код возврата остаётся равным 0 при корректной структуре пути.
Создаёт ли mkdir -p каталоги с теми же правами, что и родительский каталог?
Нет, права доступа для новых каталогов рассчитываются отдельно на основе значения umask текущего пользователя. Родительские разрешения не копируются. Если требуется задать конкретные права, их нужно изменить после создания с помощью chmod или задать владельца через chown.
Почему mkdir -p выдаёт ошибку, хотя используется ключ -p?
Ошибка возникает, если один из элементов пути не является каталогом или у пользователя нет прав на запись. Например, если в середине пути находится обычный файл, команда не может продолжить создание структуры и завершается с ненулевым кодом возврата.
Можно ли использовать mkdir -p для создания сразу нескольких каталогов?
Да, оболочка позволяет указывать несколько путей в одной команде. Также поддерживается разворачивание фигурных скобок, что даёт возможность создать набор каталогов одной командой, например для логов, конфигураций и временных данных проекта.
Чем опасно использование mkdir -p в системных каталогах?
При запуске с правами администратора команда может создать каталоги в неожиданных местах при ошибке в пути. Это усложняет сопровождение системы и может привести к путанице в структуре файлов. Перед выполнением стоит внимательно проверять абсолютные пути и переменные окружения.
Чем mkdir -p отличается от проверки каталога через test -d перед созданием?
Использование mkdir -p избавляет от отдельной проверки существования каталога. Команда сама определяет, какие уровни пути отсутствуют, и создаёт их по порядку. При этом повторный запуск не приводит к ошибке, а код возврата остаётся нулевым при корректной структуре. Вариант с test -d требует дополнительной логики и усложняет скрипт, особенно при работе с вложенными каталогами.
