Перейти к содержимому
RootPoligon

Файловая система и пути

Чтение и практика ~10 мин

Ситуация

Коллега пишет: «Порт сервиса записан в файле config.ini в папке site». Вы открыли терминал. Где эта папка? В какой папке вы сейчас? И что делать, если команда отвечает No such file or directory, хотя файл точно существует?

Дерево папок

В Linux все файлы лежат в одном дереве. У дерева один корень — папка / (косая черта). Внутри корня — другие папки, внутри них — следующие:

/
├── etc          настройки программ
├── root         домашняя папка пользователя root
│   └── practice учебная папка этого урока
├── var
│   └── log      журналы
└── home         домашние папки обычных пользователей

Дисков C: и D:, как в Windows, нет: всё начинается с /. Папку в Linux часто называют каталогом — это одно и то же.

Где я: текущая папка

Shell всегда «стоит» в какой-то папке — она называется текущей. Её показывает команда pwd:

pwd
/root

То же видно в приглашении: ~ — домашняя папка. У root она находится в /root.

Абсолютный и относительный путь

Путь — адрес файла или папки в дереве. Бывает двух видов.

Абсолютный путь начинается с / и ведёт от корня. Он одинаково работает из любой текущей папки: /root/practice/site/config.ini.

Относительный путь начинается без / и отсчитывается от текущей папки. Если вы стоите в /root/practice, то site/config.ini значит /root/practice/site/config.ini. Из другой папки тот же относительный путь укажет на другое место — или в никуда.

Сравнение с городом: абсолютный путь — полный адрес «город, улица, дом»; относительный — «второй дом направо отсюда». Второе удобно, но работает, только если вы знаете, где стоите.

Несколько специальных обозначений:

  • . — текущая папка;
  • .. — папка уровнем выше;
  • ~ — домашняя папка.

Учебная папка

Чтобы не трогать ничего важного, создадим отдельную папку ~/practice с двумя файлами. Этот блок только создаёт папки и записывает в них две короткие строки — его можно скопировать целиком:

mkdir -p ~/practice/notes ~/practice/site
printf 'Проверить логи сервиса\nОбновить пакеты\n' > ~/practice/notes/todo.txt
printf 'port=8081\n' > ~/practice/site/config.ini

mkdir -p создаёт папки (и все недостающие по пути), printf ... > файл записывает текст в файл. Подробно эти команды не нужны: в курсе мы почти всегда только читаем файлы.

Смотрим и переходим: ls и cd

ls показывает содержимое папки. Без параметров — текущей, с путём — указанной:

ls ~/practice
notes
site

С параметром -F к папкам добавляется /, так проще отличить их от файлов:

ls -F ~/practice
notes/
site/

cd меняет текущую папку («change directory»). Перейдём в учебную папку и проверим, где мы:

cd ~/practice
pwd
/root/practice

Теперь относительные пути отсчитываются отсюда:

ls notes
todo.txt

Подняться на уровень выше — cd ... Вернуться домой — cd без параметров.

Читаем файл: cat

cat выводит содержимое файла в терминал и ничего в нём не меняет:

cat ~/practice/notes/todo.txt
Проверить логи сервиса
Обновить пакеты

Для длинных файлов полезны head -n 5 файл (первые 5 строк) и tail -n 5 файл (последние 5). Ими агент обычно читает большие логи, чтобы не залить экран тысячами строк.

Когда путь не найден

Ошибка в пути — самая частая у новичков и у агентов. Попробуйте перейти в папку, которой нет:

cd ~/practice/nope
bash: cd: /root/practice/nope: No such file or directory

Shell сам раскрыл ~ и показывает полный путь, который он пытался открыть. Сравните его с тем, что ожидали. Частые причины: опечатка, другой регистр букв (Site и site — разные папки), относительный путь из «не той» текущей папки.

Разобранный пример

Вы стоите в /root/practice/notes (перейдите туда: cd ~/practice/notes) и хотите прочитать config.ini из соседней папки site.

  1. Где я? pwd → /root/practice/notes.
  2. Где файл? /root/practice/site/config.ini.
  3. Относительный путь: на уровень выше (..), затем в site: ../site/config.ini.
cat ../site/config.ini
port=8081

Абсолютный путь cat /root/practice/site/config.ini сработал бы из любой папки.

Самостоятельный шаг

Исходное состояние: учебная папка создана, текущая папка — домашняя (cd без параметров).

  1. Перейдите в ~/practice/site.
  2. Предскажите, что покажет pwd, и проверьте.
  3. Не выходя из этой папки, прочитайте todo.txt относительным путём.
  4. Прочитайте тот же файл абсолютным путём.
  5. Вернитесь домой одной командой и убедитесь, что вы там.

Признак успеха: обе команды чтения выводят две строки списка дел, а в конце pwd показывает /root.

Подсказка 1

Нарисуйте путь от текущей папки до файла: сколько уровней вверх и в какую папку потом вниз?

Подсказка 2

Подъём на уровень — ... Из site до practice один подъём.

Подсказка 3

Относительный путь: ../notes/todo.txt. Абсолютный начинается с /root/practice/.

Решение — в answers/02-files-and-paths.md.

Если результат другой

  • No such file or directory при относительном пути. Выполните pwd: скорее всего, вы не в той папке, от которой считали путь.
  • cat: ...: Is a directory. Вы передали cat папку, а не файл. Посмотрите её содержимое ls и выберите файл.
  • Учебной папки нет (ls ~/practice выдаёт ошибку). Блок создания не выполнился целиком — повторите его: команды безопасно запускать снова.

Проверка понимания

  1. Вы в /etc. Куда укажет относительный путь practice/notes? А абсолютный /root/practice/notes?
  2. Агент пишет: «прочитаю конфиг» — и предлагает cat config.ini. Что нужно знать, чтобы понять, какой файл он откроет?

Ответы — в answers/02-files-and-paths.md.

Дальше: Навигация по серверу — найти на учебном сервере файл настроек сервиса, не зная заранее, где он лежит.

Проверка автора и источники

  • Воспроизведено: pwd, ls, ls -F, cd, cd .., cat, cat ../site/config.ini, сообщение bash: cd: ...: No such file or directory (интерактивный bash) — Ubuntu 24.04, bash 5.2, локальный контейнер.
  • Учебная папка создаётся самим учеником и не зависит от образа лабы.
  • Источники: man pwd, man ls, man cat, help cd (встроенная команда bash), Filesystem Hierarchy Standard 3.0 — назначение /etc, /var/log, /root, /home.
Разбор и ответы — откройте после своей попытки

Самостоятельный шаг

cd ~/practice/site
pwd
/root/practice/site

Относительный путь из site: подняться в practice и спуститься в notes:

cat ../notes/todo.txt

Абсолютный путь работает из любой папки:

cat /root/practice/notes/todo.txt

Обе команды выводят:

Проверить логи сервиса
Обновить пакеты

Возврат домой и проверка:

cd
pwd
/root

Допустимые альтернативы: cat ~/practice/notes/todo.txt (тильда раскрывается в /root, путь фактически абсолютный), cd ~ вместо cd.

Воспроизведено: Ubuntu 24.04, bash 5.2, локальный контейнер; пользователь root.

Проверка понимания

  1. Из /etc относительный путь practice/notes указывает на /etc/practice/notes — такой папки нет, будет ошибка. Абсолютный /root/practice/notes ведёт в учебную папку из любого места.
  2. Нужно знать текущую папку агента: относительный config.ini откроется в ней. Попросите агента использовать абсолютный путь или сначала показать pwd — тогда понятно, какой файл он читает.

Прочитали и разобрались? Отметьте урок — прогресс сохранится в этом браузере.