Пути и каталоги Linux: pwd, cd, ls и карта файловой системы
Автор: Казачкин Даниил Михайлович · Обновлено
Путь указывает, где искать объект относительно корня или текущего каталога. Большинство ошибок «файл не найден» начинаются с неверной исходной точки, регистра букв или…
Путь указывает, где искать объект относительно корня или текущего каталога. Большинство ошибок «файл не найден» начинаются с неверной исходной точки, регистра букв или пропущенных кавычек. Разберём навигацию на временном дереве, которое не зависит от ваших документов.
Абсолютный путь, относительный путь и домашний каталог
Абсолютный путь начинается с /, относительный — разрешается от текущего рабочего каталога. . обозначает текущий каталог, .. — родительский. Shell раскрывает ~ в домашний каталог; cd без аргументов использует HOME, а cd - возвращает в предыдущий каталог. /home — обычный родитель домашних каталогов, но ваш дом не обязан находиться именно там; домашний каталог root обычно /root.
navigation_lab=$(mktemp -d)
mkdir -p "$navigation_lab/project/source" "$navigation_lab/project/docs"
touch "$navigation_lab/project/.env" "$navigation_lab/project/source/main.txt"
(
cd "$navigation_lab/project" || exit
pwd
cd source || exit
printf 'relative: '; pwd
cd .. || exit
ls -la
)Подоболочка в скобках изолирует смену каталога. После блока исходная оболочка остаётся на прежнем месте. Вывод pwd внутри заканчивается на /project, затем /project/source; ls -la включает .env. Не копируйте случайную часть пути mktemp как постоянную настройку.
Каталог загрузок может называться Downloads, Загрузки или иначе. Проверяйте ls -l ~; в графической среде с xdg-user-dirs путь показывает xdg-user-dir DOWNLOAD. cd ~/Downloads корректен только если такой каталог существует. Регистр обычно значим: Downloads и downloads — разные имена.
Что именно показывает ls
| Команда | Что меняется |
|---|---|
ls -1 | Одно имя на строку; это цифра один |
ls -l | Тип, права, число ссылок, владелец, группа, размер, время |
ls -la | Подробный список, включая скрытые имена |
ls -lh | Размеры в удобных единицах |
ls -ld path | Метаданные самого каталога, а не его содержимого |
ls -R path | Рекурсивный просмотр подкаталогов |
Размер каталога в ls -ld не равен сумме всех вложенных данных. Для этого используют du; свободное место файловой системы показывает df. Имена с переводами строк делают построчный разбор ls ненадёжным, поэтому для автоматической обработки файлов применяют find с NUL-разделителями.
tree -a -L 2 "$navigation_lab" показывает дерево глубиной два, включая скрытые имена. Если tree отсутствует, поставьте одноимённый пакет штатным менеджером, например sudo apt install tree в Debian/Ubuntu, либо используйте find "$navigation_lab" -maxdepth 2 -print. Устанавливать tree для понимания дерева необязательно.
Стек каталогов и символические пути
pushd переходит в каталог и сохраняет стек, popd возвращает сохранённую позицию, dirs -v показывает стек. Это удобно при чередовании каталога исходников и результатов. Bash обычно сохраняет логический путь через символические ссылки: pwd -L и pwd -P могут отличаться. Физический вариант разрешает ссылки, что полезно перед операцией с конкретным деревом.
(
pushd "$navigation_lab/project/source" >/dev/null || exit
pushd ../docs >/dev/null || exit
dirs -v
popd >/dev/null || exit
pwd -P
)Последняя строка указывает на source. Команда sudo cd не меняет каталог родительского shell: cd — встроенная операция над текущим процессом. При разрешённой административной задаче можно выполнить sudo -u account sh -c 'cd /нужный/каталог && команда', но такая оболочка имеет отдельное состояние. Для просмотра чаще достаточно точно адресованной команды без смены каталога.
Где Linux хранит разные данные
| Путь | Назначение и типичные примеры |
|---|---|
/etc | Настройки: hosts, group, apt/sources.list; environment и default читаются разными потребителями |
/usr, /usr/local, /opt | Пакетные программы, локально установленные программы и отдельные дополнительные приложения |
/home, /root | Пользовательские домашние каталоги и дом администратора |
/srv | Данные, которые предоставляет служба |
/var/log, /var/lib, /var/cache | Журналы, постоянное состояние приложения, восстанавливаемый кеш |
/run, /var/run | Состояние текущей загрузки; второй путь часто ссылка на первый |
/tmp, /var/tmp | Временные данные; политика очистки различается, /var/tmp обычно переживает перезагрузку |
/dev | Устройства и специальные объекты: null, диски sda, loop, mapper, USB-устройства |
/proc, /sys | Виртуальные сведения и интерфейсы ядра, процессов и устройств |
/var/www — распространённое соглашение веб-сервера, а не обязательное место любого сайта. /bin и /sbin в системах с объединённым /usr могут быть ссылками; это не повреждение. /etc/hosts сопоставляет имена с адресами, /etc/resolv.conf часто управляется службой resolver. Файлы /etc/network/interfaces и /etc/networks не взаимозаменяемы: первый может описывать интерфейсы для ifupdown, второй — именованные сети для NSS. Их наличие не доказывает, что сеть настраивается именно ими.
/dev/loopN позволяет обращаться к обычному файлу как к блочному устройству, например для образа ФС. /dev/mapper содержит именованные отображения device mapper, применяемые LVM и шифрованием. /dev/sda обычно обозначает целый диск, /dev/sda1 — раздел; NVMe использует другие имена. USB-устройство не обязано появиться в /dev/usb: узлы доступа могут находиться в /dev/bus/usb, а USB-накопитель становится блочным диском.
Нельзя очищать /var/lib как кеш или вручную удалять устройства из /dev. Перед очисткой /tmp учитывайте активные процессы и штатную политику tmpfiles; возраст файла сам по себе не подтверждает, что он никому не нужен.
Практика и ошибка поиска пути
В учебном дереве выведите только метаданные project/docs, затем его родителя и скрытый .env. Объясните разницу между ls -l и ls -ld. Добавьте каталог с пробелом и перейдите в него одним аргументом. При No such file or directory сравните pwd, ls -ld родительского пути, регистр и кавычки. При Permission denied проверьте execute-доступ на каждом родительском каталоге; это отдельная причина.
После упражнения выполните rm -r -- "$navigation_lab": переменная должна по-прежнему указывать на созданный mktemp-каталог. Удаление завершает только этот стенд и не затрагивает текущий рабочий проект.