15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
16.11.2023

Как создать новую папку в Ubuntu: полное руководство по управлению директориями

Создание новой папки в Ubuntu выполняется преимущественно с помощью команды mkdir в терминале. Базовый синтаксис — mkdir folder_name, что мгновенно создаёт директорию в вашем текущем рабочем расположении. Для вложенных структур mkdir -p parent/child/grandchild создаёт весь путь за одну операцию, даже если промежуточные директории ещё не существуют.

Это руководство выходит далеко за рамки основ. Оно охватывает все практические методы создания директорий в Ubuntu — от простого создания одной папки до рекурсивных структур, создания с учётом прав доступа и готовых к автоматизации шаблонов скриптов, используемых в реальных производственных серверных средах.

Почему правильная структура директорий важна на Linux-сервере

На любом Ubuntu-сервере файловая система является основой каждой операции. Плохо организованные директории создают каскадные проблемы: нарушенные пути приложений, неправильно настроенные иерархии прав доступа, сбои заданий резервного копирования и уязвимости безопасности, вызванные директориями с открытой записью, размещёнными в чувствительных местах.

Дисциплинированный подход к управлению директориями напрямую влияет на:

  • Наследование прав доступа — дочерние директории наследуют права родительских, если явно не переопределены, что делает начальные структурные решения критически важными
  • Область резервного копирования — инструменты резервного копирования, такие как rsync и tar, работают с деревьями директорий, поэтому логическая группировка снижает сложность резервного копирования
  • Конфигурация служб — веб-серверы (Apache, Nginx), базы данных и среды выполнения приложений зависят от предсказуемых, чётко определённых путей директорий
  • Аудит и соответствие требованиям — структурированные пути значительно ускоряют корреляцию журналов и криминалистический анализ

Если вы управляете средой VPS Хостинга или Выделенным сервером, установление последовательного соглашения о директориях с первого дня предотвращает технический долг, который быстро накапливается по мере роста системы.

Предварительные требования

Перед выполнением любой из приведённых ниже команд убедитесь в следующем:

  • У вас есть доступ к терминалу (локальному или через SSH)
  • Ваша учётная запись пользователя имеет право на запись в целевое расположение
  • Для директорий системного уровня (например, в /etc/ или /var/) у вас есть привилегии sudo
  • Версия Ubuntu: эти команды универсально применимы к Ubuntu 18.04, 20.04, 22.04 и 24.04 LTS

Чтобы в любой момент проверить текущую рабочую директорию, выполните:

pwd

Метод 1: Базовое создание директории с помощью mkdir

Команда mkdir (make directory) — стандартная утилита POSIX для создания директорий. Она доступна в каждом дистрибутиве Linux без установки.

Синтаксис:

mkdir directory_name

Пример:

mkdir project_files

Это создаёт директорию с именем project_files в вашем текущем расположении. При успешном выполнении команда не выводит никакого результата — это стандартное поведение Unix. Для подтверждения создания:

ls -la

Соглашения об именовании для использования в производственной среде:

  • Используйте строчные буквы и символы подчёркивания или дефисы: web_assets, backup-2024
  • Избегайте пробелов в именах директорий — они требуют экранирования (mkdir "my folder" или mkdir my folder) и нарушают работу многих shell-скриптов
  • Избегайте специальных символов: &, *, ?, !, | имеют специфические для оболочки значения и вызывают непредсказуемое поведение

Метод 2: Создание директории по конкретному абсолютному пути

Вместо того чтобы сначала переходить в целевое расположение, вы можете передать полный абсолютный путь непосредственно в mkdir. Это предпочтительный подход в скриптах и автоматизированном развёртывании.

Синтаксис:

mkdir /full/path/to/new_directory

Пример:

mkdir /var/www/html/myapp

Важное ограничение: Эта команда завершится ошибкой, если какая-либо промежуточная директория в пути ещё не существует. Например, если /var/www/html/ не существует, приведённая выше команда вернёт:

mkdir: cannot create directory '/var/www/html/myapp': No such file or directory

Решением является флаг -p, рассмотренный в Методе 3.

Использование относительных путей также допустимо и зачастую более читаемо в интерактивных сессиях:

mkdir ../sibling_directory
mkdir ./subdirectory

Метод 3: Рекурсивное создание вложенных директорий с помощью -p

Флаг -p (parents) — один из наиболее важных с операционной точки зрения параметров в mkdir. Он указывает команде создать все отсутствующие промежуточные директории в указанном пути и подавляет ошибку, которая обычно возникает, если целевая директория уже существует.

Синтаксис:

mkdir -p parent_directory/child_directory/grandchild_directory

Пример:

mkdir -p /var/www/html/myapp/logs/archive

Если /var/www/html/myapp/ не существует, эта единственная команда создаёт всю цепочку: myapp, затем logs внутри неё, затем archive внутри той.

Критический производственный сценарий использования — корневые директории документов веб-сервера:

mkdir -p /var/www/vhosts/example.com/{public_html,logs,ssl,tmp}

Этот синтаксис расширения фигурных скобок (подробно рассмотренный в Методе 6) в сочетании с -p является стандартным шаблоном для развёртывания новых сред виртуальных хостов в одной команде.

Флаг -p также предотвращает ошибки в идемпотентных скриптах. Если вы выполните одну и ту же команду mkdir -p дважды, второе выполнение ничего не делает и завершается с кодом 0. Без -p второй запуск вернёт ошибку, нарушая работу любого скрипта, использующего set -e (выход при ошибке).

Метод 4: Одновременное создание нескольких директорий

mkdir принимает несколько аргументов, создавая все указанные директории за один вызов.

Синтаксис:

mkdir dir1 dir2 dir3

Пример:

mkdir assets uploads cache sessions

Это создаёт четыре отдельные директории в текущем расположении. Все директории создаются на одном уровне — это не вложенная структура.

Сочетание с абсолютными путями:

mkdir /srv/app/modules /srv/app/config /srv/app/data

Сочетание с -p для нескольких вложенных путей:

mkdir -p /srv/project/frontend/src /srv/project/backend/src /srv/project/docs

Это особенно полезно при создании структуры директорий нового приложения перед развёртыванием.

Метод 5: Создание директорий с конкретными правами доступа с помощью -m

По умолчанию mkdir применяет права доступа на основе значения umask системы. На большинстве систем Ubuntu umask по умолчанию равен 0022, что означает, что новые директории получают права 755 (владелец: чтение/запись/выполнение; группа: чтение/выполнение; остальные: чтение/выполнение).

Во многих серверных сценариях права доступа по умолчанию либо слишком разрешительны, либо слишком ограничительны. Флаг -m позволяет задать точные права доступа во время создания с использованием восьмеричной нотации.

Синтаксис:

mkdir -m octal_mode directory_name

Распространённые шаблоны прав доступа:

Восьмеричный режимСимвольныйТипичный сценарий использования
700rwx------Личные данные пользователя, директории ключей SSH
750rwxr-x---Директории приложений, общие для группы
755rwxr-xr-xПубличные корневые директории документов веб-сервера
770rwxrwx---Общие директории команды
777rwxrwxrwxВременное рабочее пространство (избегайте в производственной среде)

Пример — создание защищённой директории для ключей SSH:

mkdir -m 700 ~/.ssh

Пример — создание корневой директории веб-сервера с правильными правами доступа:

mkdir -m 755 /var/www/html/newsite

Сочетание -m и -p:

mkdir -p -m 750 /srv/app/config/secrets

Обратите внимание, что при использовании -p режим применяется только к конечной директории в пути, а не к промежуточным директориям, которые создаются. Промежуточные директории получают права доступа по умолчанию на основе umask. Если вам нужен точный контроль над всеми уровнями, создавайте каждый уровень отдельно с явными флагами -m или используйте chmod после создания.

Метод 6: Расширение фигурных скобок для сложных деревьев директорий

Расширение фигурных скобок — это функция оболочки Bash, а не параметр mkdir, которая генерирует несколько аргументов из одного шаблона. В сочетании с mkdir -p это наиболее эффективный способ создания сложных иерархий директорий.

Базовое расширение фигурных скобок:

mkdir -p project/{src,tests,docs,build}

Это раскрывается в:

mkdir -p project/src project/tests project/docs project/build

Многоуровневое расширение фигурных скобок:

mkdir -p app/{frontend/{components,pages,styles},backend/{controllers,models,routes},shared/utils}

Это создаёт следующую структуру:

app/
├── frontend/
│   ├── components/
│   ├── pages/
│   └── styles/
├── backend/
│   ├── controllers/
│   ├── models/
│   └── routes/
└── shared/
    └── utils/

Этот шаблон является стандартной практикой при инициализации новых репозиториев приложений или развёртывании директорий приложений на новом VPS с cPanel или выделенном сервере.

Метод 7: Создание директорий через графический интерфейс Ubuntu (приложение «Файлы»)

Для настольных установок Ubuntu или сессий удалённого рабочего стола приложение GNOME «Файлы» (Nautilus) предоставляет графический метод.

Шаги:

  1. Откройте приложение Файлы из меню «Действия» или панели задач
  2. Перейдите в родительскую директорию, где вы хотите создать новую папку
  3. Щёлкните правой кнопкой мыши на пустой области внутри директории
  4. Выберите Новая папка из контекстного меню
  5. Введите желаемое имя папки и нажмите Enter

Сочетание клавиш: В Nautilus Ctrl+Shift+N мгновенно создаёт новую папку без использования контекстного меню.

Ограничения графического подхода:

  • Невозможно задать пользовательские права доступа во время создания — требуется последующее действие в терминале или свойствах файла
  • Невозможно создать рекурсивные вложенные структуры за одну операцию
  • Недоступно в безголовых серверных средах (подавляющее большинство производственных серверов Ubuntu работают без среды рабочего стола)

Для любой серьёзной работы по администрированию серверов всегда предпочтительны методы командной строки.

Метод 8: Скриптовое создание директорий для автоматизации

В реальном администрировании серверов директории редко создаются вручную по одной. Скрипты развёртывания, конвейеры CI/CD и инструменты управления конфигурацией — все они полагаются на автоматизированное создание директорий.

Пример базового shell-скрипта:

#!/bin/bash
set -e

BASE_DIR="/var/www/vhosts"
DOMAIN="example.com"

directories=(
    "$BASE_DIR/$DOMAIN/public_html"
    "$BASE_DIR/$DOMAIN/logs"
    "$BASE_DIR/$DOMAIN/ssl"
    "$BASE_DIR/$DOMAIN/tmp"
    "$BASE_DIR/$DOMAIN/backup"
)

for dir in "${directories[@]}"; do
    mkdir -p "$dir"
    echo "Created: $dir"
done

# Set ownership to web server user
chown -R www-data:www-data "$BASE_DIR/$DOMAIN"
chmod -R 755 "$BASE_DIR/$DOMAIN"

echo "Directory structure for $DOMAIN provisioned successfully."

Ключевые практики написания скриптов:

  • Всегда используйте set -e для прерывания при любой ошибке
  • Заключайте все переменные в кавычки ("$dir"), чтобы безопасно обрабатывать пути с пробелами
  • Комбинируйте mkdir -p с chown и chmod в одном скрипте, чтобы обеспечить правильность прав доступа сразу после создания
  • Используйте массивы для списков директорий, чтобы скрипты оставались читаемыми и удобными в сопровождении

Этот подход необходим при управлении несколькими виртуальными хостами, развёртывании приложений в разных средах или автоматизации настройки сервера с помощью таких инструментов, как Ansible или скрипты развёртывания на основе Bash.

Сравнение: параметры mkdir и их сценарии использования

КомандаСоздаёт промежуточные директорииЗадаёт права доступаНесколько директорийИдемпотентна
mkdir dirНетНет (использует umask)НетНет
mkdir -p path/to/dirДаНет (использует umask)НетДа
mkdir -m 755 dirНетДаНетНет
mkdir -p -m 750 path/dirДаДа (только конечная директория)НетДа
mkdir dir1 dir2 dir3НетНет (использует umask)ДаНет
mkdir -p {a,b,c}/subДаНет (использует umask)ДаДа

Распространённые ошибки и способы их устранения

Ошибка: Permission denied

mkdir: cannot create directory '/etc/myapp': Permission denied

Причина: Вы пытаетесь выполнить запись в директорию, принадлежащую системе, без повышенных привилегий.

Решение: Добавьте sudo в начало:

sudo mkdir /etc/myapp

Ошибка: No such file or directory

mkdir: cannot create directory '/srv/app/config': No such file or directory

Причина: Одна или несколько промежуточных директорий в пути не существуют.

Решение: Используйте флаг -p:

mkdir -p /srv/app/config

Ошибка: File exists

mkdir: cannot create directory 'mydir': File exists

Причина: Директория или файл с таким именем уже существует.

Решение: Используйте -p для подавления этой ошибки, когда существующий путь является директорией, или выберите другое имя.

Скрытый сбой в скриптах: Если mkdir завершается ошибкой, а ваш скрипт не использует set -e или не проверяет коды выхода, последующие операции могут продолжиться с несуществующим путём, вызывая непредсказуемые сбои. Всегда проверяйте критически важное создание директорий:

mkdir -p /srv/app/data || { echo "Failed to create data directory"; exit 1; }

Соображения безопасности при создании директорий

Права доступа к директориям — это первая линия защиты в безопасности сервера. Ряд серьёзных уязвимостей напрямую связан с неправильными правами доступа к директориям:

  • Директории с открытой записью для всех (777) позволяют любому пользователю системы записывать, изменять или удалять файлы — критический риск на общем хостинге или многопользовательских серверах
  • Неправильное владение веб-директориями может позволить эксплойтам веб-приложений записывать вредоносные файлы за пределами предполагаемого корня документов
  • Sticky bit (chmod +t) на общих директориях (например, /tmp) предотвращает удаление пользователями файлов, принадлежащих другим — всегда устанавливайте его на общих директориях с правом записи
  • Бит SetGID на директориях обеспечивает наследование новыми файлами группы директории, а не основной группы создающего пользователя — полезно для совместных проектных директорий

Пример — защищённая общая проектная директория:

mkdir -p /srv/shared/project
chown root:developers /srv/shared/project
chmod 2775 /srv/shared/project  # SetGID + rwxrwxr-x

При размещении веб-приложений, доменов с SSL или почтовых служб правильные права доступа к директориям неотделимы от уровня безопасности конфигурации SSL-сертификатов и настройки почтового хостинга.

Проверка создания директорий

После создания директорий всегда проверяйте результат перед выполнением зависимых операций.

Список с подробными правами доступа:

ls -la /path/to/parent/

Проверка существования конкретной директории (полезно в скриптах):

[ -d /srv/app/config ] && echo "Directory exists" || echo "Directory missing"

Просмотр полной древовидной структуры (требует пакета tree):

sudo apt install tree -y
tree /srv/app/

Проверка использования inode — на серверах с большим количеством мелких файлов исчерпание inode может предотвратить создание директорий даже при наличии свободного дискового пространства:

df -i /srv/

Если использование inode близко к 100%, вы не можете создавать новые директории или файлы независимо от доступного дискового пространства. Это распространённая производственная проблема на серверах, хранящих большое количество мелких файлов, например на почтовых серверах или в директориях PHP-сессий.

Практическая матрица решений: какой метод использовать

СценарийРекомендуемая команда
Одна директория, интерактивная сессияmkdir dirname
Директория по известному абсолютному путиmkdir /full/path/dirname
Вложенный путь, некоторые родительские директории могут не существоватьmkdir -p /full/nested/path
Несколько одноуровневых директорий одновременноmkdir dir1 dir2 dir3
Сложное многоуровневое дерево в одной командеmkdir -p root/{a,b,c}/{sub1,sub2}
Директория с нестандартными правами доступаmkdir -m 750 dirname
Скрипт автоматизированного развёртыванияmkdir -p с chown/chmod последовательно
Идемпотентный шаг конвейера развёртыванияmkdir -p (безопасен для повторного запуска)

Ключевые технические выводы

  • mkdir -p — наиболее безопасный вариант по умолчанию для любого скриптового или автоматизированного создания директорий — он идемпотентен и обрабатывает отсутствующие промежуточные пути
  • Никогда не используйте права 777 для производственных директорий; предпочитайте 755 для публичных путей и 750 или 700 для конфиденциальных данных
  • Флаг -m в mkdir задаёт права доступа только для конечной директории при использовании с -p — используйте chmod -R или отдельные вызовы mkdir для полного контроля
  • Расширение фигурных скобок — это функция Bash, а не функция mkdir — оно не будет работать в скриптах /bin/sh, если оболочкой не является Bash
  • Всегда проверяйте доступность inode (df -i) на файловых системах с высокой плотностью файлов перед массовым созданием директорий
  • Комбинируйте создание директорий с немедленным назначением chown в скриптах развёртывания, чтобы избежать окна, когда директории существуют с неправильным владельцем
  • В средах панелей управления VPS пользователи веб-сервера (обычно www-data или nginx) должны иметь право на выполнение для каждой директории в пути корня документов — не только для конечной директории

Часто задаваемые вопросы

В чём разница между mkdir folder и mkdir -p folder?

mkdir folder создаёт одну директорию и завершается ошибкой, если какая-либо часть пути не существует или если директория уже существует. mkdir -p folder создаёт все отсутствующие промежуточные директории и завершается без ошибки, если цель уже существует, что делает его безопасным для скриптов и повторного выполнения.

Может ли mkdir создать директорию с пробелами в имени?

Да. Заключите имя в кавычки: mkdir "my project folder" или экранируйте пробелы: mkdir my project folder. Однако пробелы в именах директорий настоятельно не рекомендуются на серверах, поскольку они требуют экранирования в каждой последующей команде и нарушают работу многих shell-скриптов и конфигураций приложений.

Почему mkdir завершается ошибкой «Permission denied» даже с sudo?

Обычно это происходит, когда целевая файловая система смонтирована только для чтения, когда политики SELinux или AppArmor ограничивают запись по этому пути, или когда путь находится на сетевой файловой системе с ограничениями на стороне сервера. Проверьте параметры монтирования с помощью mount | grep /target/path и просмотрите журналы AppArmor с помощью sudo aa-status.

Как создать директорию и сразу задать её владельца и группу?

mkdir сам по себе не задаёт владельца — используйте chown сразу после: mkdir -p /srv/app && chown www-data:www-data /srv/app. В одном конвейере: install -d -m 755 -o www-data -g www-data /srv/app — команда install создаёт директории с владельцем, группой и режимом за один шаг.

Что происходит с правами доступа при использовании mkdir -p с несколькими новыми уровнями?

Только конечная (самая глубокая) директория получает режим, указанный с помощью -m. Все промежуточные директории, которые создаются заново, получают права доступа на основе текущего umask. Если требуются одинаковые права доступа на всех уровнях, либо создавайте каждый уровень отдельно с явными флагами -m, либо применяйте chmod -R после создания полного пути.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать