3.4 Навигация по файловой системе

В предыдущем параграфе мы научились вводить команды, выполнять их, а также делать это эффективно за счёт сочетаний клавиш, истории команд и алиасов.

В этом параграфе научимся ориентироваться в файловой системе Linux. Мы разберёмся, чем файл отличается от каталога, что такое абсолютные и относительные пути, как устроены специальные каталоги (., .., ~) и что такое символьные ссылки. После этого вы сможете свободно перемещаться по системе и находить нужные файлы, даже если они скрыты.

Ключевые вопросы параграфа

  1. Что такое файл и каталог? Чем они различаются?
  2. Что такое путь к файлу и в чём разница между абсолютным и относительным путём?
  3. Как перемещаться по каталогам и как узнать, где вы находитесь?
  4. Как просматривать содержимое каталога?
  5. Что такое ссылки — символьные и жёсткие?

Файлы и каталоги

Начнём мы с главного:

В Linux всё хранится в виде файлов.

Файл — это единица данных: текстовый документ, картинка, программа или даже устройство (например, диск или принтер). Файл может содержать текст, бинарные данные или быть пустым.

Бинарные данные?

Бинарные данные — это информация, записанная не в виде читаемого текста, а в виде байтов, понятных только программе.

Например, фотографии, видео, исполняемые файлы и архивы состоят из бинарных данных. Главное отличие от текста в том, что текстовые файлы можно открыть и прочитать обычным редактором (например, cat), а бинарные при этом покажут набор непонятных символов, потому что они содержат не буквы, а закодированные двоичные значения.

Подробнее о том, как компьютер хранит данные в памяти, можно прочитать в нашем хендбуке по компьютерным наукам.

Каталог (или директория) — это особый тип файла, который хранит ссылки на другие файлы и каталоги. Каталог можно рассматривать как «папку», в которой находятся имена и пути к содержимому.

Пример:

  • /home/alice/document.txt — обычный файл;
  • /home/alice/Pictures/ — каталог.

Важно: файл хранит данные, а каталог — это список файлов и других каталогов.

Каталоги могут содержать вложенные каталоги, образуя иерархию. В Linux нет дисков C: или D:, как в Windows. Вместо этого вся система файлов оорганизована в едином дереве, начинающееся с корня /. Например:

1/
2├── bin/
3├── etc/
4├── home/
5│ └── alice/
6│ └──── Documents/
7└── var/
  • /bin — каталог, который содержит базовые программы (например, ls, cat);
  • /etc — каталог, который содержит конфигурационные файлы; они определяют, как именно работают система и программы, какие настройки для работы используются;
  • /home — домашние каталоги пользователей, где хранятся личные файлы и настройки;
  • /var — журналы и временные данные — файлы, необходимые для работы программ; например, если что-то перестаёт работать, в журналах /var/log можно найти причину.

Все устройства (жёсткие диски, USB-флешки) после подключения становятся доступны в дереве каталогов — это называется монтированием. Например, флешка может появиться в /media/alice/USB.

Это лишь небольшая часть дерева Linux. На самом деле каталогов гораздо больше: /usr, /lib, /tmp, /dev, /proc и многие другие. Каждый из них играет свою роль. Например, одни хранят библиотеки и драйверы, другие представляют устройства или служат для временных файлов. Мы познакомимся с ними подробнее по мере изучения системы Linux.

Главное, что стоит запомнить

  • В Linux всё организовано в едином дереве с корнем /.
  • Пути к файлам записываются через прямой слеш / (в Windows — обратный слеш \).
  • Нет разделения на диски с буквами — все носители подключаются в дерево каталогов.

Файловая система Linux выглядит сложной только на первый взгляд. На деле она проще и логичнее: всё находится в одном дереве, начиная от корня /.

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

Чтобы обратиться к файлу или каталогу в Linux, нужно указать путь — последовательность каталогов, которые ведут к нужному объекту. В терминале существуют два способа описывать местоположение объекта — через абсолютный путь и через относительный. Давайте разберём, чем они различаются.

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

Когда в одном из предыдущих параграфов мы читали переменную $HOME, то получали путь к домашнему каталогу текущего пользователя:

1alice@ubuntu:~$ echo $HOME
2/home/alice

/home/alice — это абсолютный путь, или полный путь к файлу, начинающийся от корневого каталога /.

Абсолютный путь показывает точное расположение файла в системе и не зависит от того, где вы находитесь сейчас — в домашнем каталоге ~ (эта запись эквивалентна /home/alice) или в другом месте.

Пример абсолютного пути:

1/home/alice/Documents/report.txt

Путь до файла report.txt можно изобразить как полное дерево, которое начинается от корня /:

1/
2├── bin/
3├── etc/
4├── home/
5│   └── alice/
6│       └── Documents/
7│           └── report.txt
8└── var/

Относительный путь

Относительный путь задаётся относительно текущего каталога, в котором вы находитесь. Чтобы узнать, где вы находитесь, используйте команду pwd:

1alice@ubuntu:~$ pwd
2/home/alice

Название команды pwd расшифровывается как print working directory — «показать рабочий каталог».

Если вы находитесь в каталоге /home/alice, то для перехода в подкаталог /home/alice/Documents можно написать:

1alice@ubuntu:~$ cd Documents

Здесь Documents — это относительный путь, он указывает не полный адрес, а лишь путь от текущего положения.

Мы можем проверить, что мы действительно перешли в подкаталог Documents при помощи команды pwd:

1alice@ubuntu:~/Documents$ pwd
2/home/alice/Documents

Как видим, наше местоположение изменилось на /home/alice/Documents.

Команда cd позволяет изменить текущее положение или текущий каталог, и это основной способ путешествия по иерархии каталогов в Linux.

В домашнем каталоге вашего пользователя может не быть каталога Documents, тогда вы увидите следующую ошибку:

1alice@ubuntu:~$ cd Documents
2-bash: cd: Documents: No such file or directory

Но не смущайтесь, мы можем создать каталог Documents сами. Помните команду для создания пустого каталога?

1alice@ubuntu:~$ mkdir Documents

Теперь мы можем перейти в него (cd) и проверить текущий каталог (pwd).

1alice@ubuntu:~$ cd Documents
2alice@ubuntu:~/Documents$ pwd
3/home/alice/Documents

Мы перешли в каталог Documents из домашнего каталога ~ или /home/alice по относительному пути, но то же самое можно сделать, используя абсолютный путь:

1alice@ubuntu:~$ cd /home/alice/Documents
2alice@ubuntu:~/Documents$ pwd
3/home/alice/Documents

Специальные обозначения

Кроме абсолютного и относительного путей, есть ещё и специальные обозначения:

  • . — текущий каталог;
  • .. — родительский каталог;
  • ~ — уже знакомый вам домашний каталог текущего пользователя.

Например, если мы находимся в каталоге /home/alice/Documents, мы можем вернуться на уровень выше при помощи cd ..:

1alice@ubuntu:~/Documents$ pwd
2/home/alice/Documents
1alice@ubuntu:~/Documents$ cd ..
2alice@ubuntu:~$ pwd
3/home/alice

Представим, что мы оказались в корне / и хотим быстро вернуться в наш домашний каталог ~. Здесь нам поможет команда cd ~:

1alice@ubuntu:~$ cd /
2alice@ubuntu:/$ pwd
3/

Сейчас мы находимся в корне /.

1alice@ubuntu:/$ cd ~
2alice@ubuntu:~$ pwd
3/home/alice

А теперь мы снова вернулись в домашний каталог /home/alice.

С .. и ~ мы разобрались. Но для чего может потребоваться .?

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

1alice@ubuntu:~$ pwd
2/home/alice
3alice@ubuntu:~$ cp /home/alice/Documents/document.txt .

Мы находимся в каталоге /home/alice, мы копируем файл document.txt из каталога /home/alice/Documents/ в нашу текущую папку . (в нашем случае home/alice). Очень удобно!

Файловую систему можно представить как город.

  • Абсолютный путь — это полный адрес, включая страну, город, улицу и номер дома. Такой адрес уникален, понятен любому и позволяет добраться до нужного дома независимо от начального местоположения.
  • Относительный путь — это короткое указание вроде «зайди в соседнюю комнату» или «поднимись на следующий этаж».

Мы научились переходить по веткам нашего дерева (cd) и узнавать, на какой именно ветке мы находимся (pwd).
Дальше научимся смотреть, что есть на каждой из веток, с помощью команды ls.

Просмотр каталога

С командой ls вы уже знакомы. Но она очень важна для перемещения по дереву каталогов, поэтому давайте повторим ещё раз.

Посмотрим, какие файлы и каталоги находятся внутри текущего каталога:

1alice@ubuntu:~$ ls
2Documents  alice.txt  document.txt

По умолчанию ls выводит список имён в алфавитном порядке, но у неё есть множество полезных и незаменимых опций:

  • -l — подробный список: права доступа, владелец, размер, дата изменения;
  • -a — показать все файлы, включая скрытые (имена начинаются с символа .);
  • -h — отображать размеры файлов в удобном виде (KB, MB, GB); обычно используется вместе с -l.

Полный список опций можно посмотреть при помощи команды ls --help.

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

1alice@ubuntu:~$ ls -lh /var/log

Иногда команда ls показывает меньше файлов, чем мы ожидаем. Дело в том, что часть файлов в Linux скрыты от обычного взгляда — они начинаются с точки (.) и служат для хранения служебных данных и настроек.

Скрытые файлы

Команда ls -a позволит увидеть скрытые файлы в каталоге:

1alice@ubuntu:~$ ls -a
2.  ..  .bash_history  .bash_logout  .bashrc  .cache  .lesshst  .profile  .ssh  Documents  alice.txt  document.txt

Давайте добавим опцию -l для удобства просмотра:

1alice@ubuntu:~$ ls -al
2total 40
3drwxr-x--- 5 alice alice 4096 Oct  6 08:41 .
4drwxr-xr-x 3 root  root  4096 Sep 23 14:54 ..
5-rw------- 1 alice alice  739 Oct  3 14:28 .bash_history
6-rw-r--r-- 1 alice alice  220 Mar 31  2024 .bash_logout
7-rw-r--r-- 1 alice alice 3771 Mar 31  2024 .bashrc
8drwx------ 2 alice alice 4096 Sep 23 14:54 .cache
9-rw------- 1 alice alice   64 Sep 29 06:52 .lesshst
10-rw-r--r-- 1 alice alice  807 Mar 31  2024 .profile
11drwx------ 2 alice alice 4096 Oct  2 06:12 .ssh
12drwxrwxr-x 2 alice alice 4096 Oct  6 08:40 Documents
13-rw-rw-r-- 1 alice alice    0 Oct  1 05:19 alice.txt
14-rw-rw-r-- 1 alice alice    0 Oct  6 08:41 document.txt

Обратите внимание на файлы, которые начинаются с точки (.). По умолчанию они скрыты и не будут отображены без использования опции -a, чтобы не загромождать список файлов.

В начале списка мы также можем заметить два уже знакомых нам особых имени:

  • . — текущий каталог;
  • .. — родительский каталог.

Они всегда присутствуют внутри каждого каталога и позволяют быстро перемещаться по дереву файловой системы.

Скрытые файлы — это служебные настройки пользователя и программ. Они хранят конфигурацию среды, историю команд и другие настройки.
В домашнем каталоге ~ обычно есть следующие скрытые файлы:

Файл

Назначение

.bashrc

Настройки командной оболочки Bash (например, алиасы, цвета, переменные окружения)

.bash_history

История введённых команд

.profile

Команды, которые выполняются при входе в систему

.ssh/

Ключи и настройки SSH

.cache/

Временные данные программ

Скрытие таких файлов делает работу в терминале удобнее: вы видите только свои документы, а не десятки системных конфигураций.

Также обратите внимание на файл ~/.bash_history — это постоянное хранилище истории команд пользователя, той самой, с которой мы работали в предыдущем параграфе при помощи команды history.

Мы можем вывести содержимое файла при помощи команды cat:

1alice@ubuntu:~$ cat ~/.bash_history

И сравнить его с выводом команды history.

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

  • cd <путь> — для того, чтобы перейти в новый каталог;
  • cd .. — для того, чтобы вернуться в родительский каталог;
  • pwd — для того, чтобы знать, где мы находимся сейчас;
  • ls — для того, чтобы посмотреть содержимое каталога, в котором мы находимся.

Давайте проверим, насколько вы освоились с навигацией по файловой системе:

Чтобы добавить в заметки выделенный текст, нажмите Ctrl + E
Проверь себяСоедините порядковый номер со словом

Мы уже умеем находить и просматривать файлы. Теперь давайте посмотрим, как Linux позволяет связывать файлы между собой. Это называется ссылками (англ. links).

Ссылки

Символьные ссылки

Символьная ссылка (или symlink) — это особый файл, который указывает на другой файл или каталог. Если вы создавали ярлыки на рабочем столе Windows для удобства запуска программ, то поймёте, что здесь работает тот же принцип: при обращении к ссылке система переходит к объекту, на который ссылка указывает.

Давайте создадим новый пустой файл, заполненный текстом:

1alice@ubuntu:~$ touch report.txt
2alice@ubuntu:~$ echo "Important report contents" > report.txt
3alice@ubuntu:~$ cat report.txt
4Important report contents

Мы создали файл report.txt при помощи команды touch, а затем мы сохранили текст в этот файл, перенаправив вывод (>) из команды echo в report.txt. Мы убедились, что файл теперь имеет содержимое, при помощи команды cat.

Что за перенаправление вывода?

Символ > называется оператором перенаправления вывода.

Он говорит системе записать результат работы команды в файл. Мы очень подробно разберём это в одном из следующих параграфов. Пока нам просто нужно чем-то заполнить файл, и перенаправление из команды echo позволяет нам именно этого и достичь.

Теперь создадим ссылку на файл report.txt, назовём её report-link и используем для этого новую для нас команду ln -s:

1alice@ubuntu:~$ ln -s report.txt report-link

Если мы посмотрим список файлов в каталоге, мы увидим наш новый объект:

1alice@ubuntu:~$ ls -l
2
3lrwxrwxrwx 1 alice alice 10 Oct  6 12:51 report-link -> report.txt
4-rw-rw-r-- 1 alice alice 26 Oct  6 12:47 report.txt

Прежде всего обратите внимание на букву l в списке прав (lrwxrwxrwx) для файла report-link. Она говорит о том, что перед нами ссылка, а не сам файл.
Указатель -> также говорит о том, что перед нами ссылка, и указывает она на файл report.txt.

Мы можем прочитать как сам файл, так и его ссылку и получить один и тот же результат:

1alice@ubuntu:~$ cat report.txt
2Important report contents
3
4alice@ubuntu:~$ cat report-link
5Important report contents

Давайте обновим содержание файла report.txt:

1alice@ubuntu:~$ echo "Another important report contents" > report.txt
2alice@ubuntu:~$ cat report.txt
3Another important report contents

Если мы проверим содержимое по ссылке — её содержимое также будет изменено:

1alice@ubuntu:~$ cat report-link
2Another important report contents

Заметьте, мы использовали команду ln с опцией -s, и это не случайно: команда с опцией -s и команда без неё делают абсолютно разные вещи.

  • Команда с опцией -s создаёт символьную, или мягкую, ссылку, то есть просто «ярлык», и если удалить исходный файл, то ссылка сломается.
  • Команда без опции -s создаёт жёсткую ссылку. Мы ссылаемся не просто на уже существующий файл по его имени в файловой системе, а на те же самые данные на физическом диске. Удаление одного файла не повлияет на работу второго, пока существует хотя бы один.

Давайте посмотрим, как создать жёсткую ссылку. У нас уже есть файл report.txt:

1alice@ubuntu:~$ cat report.txt
2Important report contents

Создадим для него жёсткую ссылку с именем new-report.txt:

1alice@ubuntu:~$ ln report.txt new-report.txt

Посмотрим на список файлов в каталоге:

1alice@ubuntu:~$ ls -l
2
3-rw-rw-r-- 2 alice alice 34 Oct  6 13:06 new-report.txt
4lrwxrwxrwx 1 alice alice 10 Oct  6 12:51 report-link -> report.txt
5-rw-rw-r-- 2 alice alice 34 Oct  6 13:06 report.txt

Обратите внимание: у нас появился новый файл new-report.txt, но он не выглядит как ссылка report-link, у него отсутствует флаг l в начале строки.

Давайте попробуем изменить файл report.txt, чтобы убедиться, что new-report.txt — это ссылка, а не самостоятельный файл:

1alice@ubuntu:~$ echo "Another very important report contents" > report.txt
2alice@ubuntu:~$ cat report.txt
3Another very important report contents

Попробуем проверить нашу ссылку new-report.txt:

1alice@ubuntu:~$ cat new-report.txt
2Another very important report contents

Содержимое тоже изменилось!

Это происходит потому, что файлы report.txt и new-report.txt указывают на один и тот же inode (от англ. index node) — внутренний идентификатор файла в файловой системе.

inode — «паспорт» файла: тип, права, владелец/группа, размер, временные метки, счётчик ссылок и указатели на блоки данных. При этом имя файла хранится не в inode, а в каталоге, как ссылка на этот inode.

Чтобы увидеть этот идентификатор, можно воспользоваться командой ls с опцией -i (добавим -l для читабельности):

1alice@ubuntu:~$ ls -il
2
3524303 -rw-rw-r-- 2 alice alice 39 Oct  6 13:22 new-report.txt
4524306 lrwxrwxrwx 1 alice alice 10 Oct  6 12:51 report-link -> report.txt
5524303 -rw-rw-r-- 2 alice alice 39 Oct  6 13:22 report.txt

Обратите внимание, что у обоих файлов одинаковый идентификатор 524303 — он указывает на один и тот же inode.
Также обратите внимание на цифру 2 после прав доступа: это счётчик ссылок, и он говорит о том, что на этот inode сейчас указывают два файла.

Ещё один интересный момент: символьная ссылка report-link создала свой собственный inode, в котором хранит путь до файла report.txt, и не увеличивает число в счётчике ссылок.

2.4.1

Каждый файл в Linux — это одна (первая) жёсткая ссылка на свой inode. При помощи команды ln мы можем создать дополнительные ссылки.

Давайте подытожим для мягких и жёстких ссылок:

Характеристика

Жёсткая ссылка (ln)

Символьная ссылка (ln -s)

На что указывает

inode (фактические данные)

путь к другому файлу

При удалении оригинала

данные остаются доступны

ссылка ломается

Может ссылаться на каталог

нет

да

Может ссылаться на файл на другом диске

нет

да

Как выглядит в ls -l

обычный файл, без ->

виден как link -> target

Количество ссылок (ls -l)

увеличивает

не изменяет

Также зафиксируем, для чего вообще нужны ссылки:

  • Упрощают доступ к часто используемым файлам и каталогам (можно создать ярлык в удобном месте).
  • Позволяют иметь несколько имён для одного и того же файла — особенно полезно при совместной работе или автоматизации.
  • Избавляют от необходимости дублировать файлы — экономят место и упрощают обновления.
  • Позволяют создавать стабильные «ярлыки» на динамически изменяемые файлы или каталоги.
  • Часто используются в конфигурациях: например, в каталогах /etc и /usr/lib часто встречаются символьные ссылки, ведущие на актуальные версии программ и библиотек.

Давайте попробуем составить команду для создания символьной ссылки link на для файла file.txt:

Чтобы добавить в заметки выделенный текст, нажмите Ctrl + E
Проверь себяРасставь слова по порядку

Что дальше

Мы уже научились ориентироваться в дереве каталогов, создавать и находить файлы. Теперь сделаем шаг дальше — узнаем подробнее, как работать с файлами и каталогами: создавать, перемещать, удалять их.

В следующем параграфе вы узнаете:

  • Как создать файл и каталог.
  • Как копировать и перемещать или переименовывать файлы и каталоги.
  • Как удалять файлы и каталоги.
  • Что такое шаблоны glob.

После этого вы сможете уверенно управлять содержимым своей файловой системы.

А пока закрепите материал на практике:

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

Ключевые выводы по параграфу

  • В Linux всё является файлами — документы, каталоги, устройства и даже процессы.
  • Каталоги — это особые файлы, которые содержат ссылки на другие файлы и каталоги.
  • Вся файловая система образует единое дерево, начинающееся с корня /.
  • Абсолютный путь начинается с / и указывает полное местоположение объекта.
  • Относительный путь задаётся относительно текущего каталога.
  • Специальные обозначения:
    • . — текущий каталог;
    • .. — родительский каталог;
    • ~ — домашний каталог пользователя.
  • Основные команды навигации:
    • pwd — показать текущий каталог;
    • cd <путь> — перейти в другой каталог;
    • cd .. — подняться на уровень выше;
    • ls — показать содержимое каталога.
  • Скрытые файлы начинаются с точки (.) и обычно содержат настройки программ и пользователя (например, .bashrc, .ssh/).
  • Символьные ссылки (ln -s) — это ярлыки, которые указывают на путь к другому файлу.
  • Жёсткие ссылки (ln) указывают на один и тот же inode и делят общее содержимое. Каждый файл в Linux — это минимум одна жёсткая ссылка на свой inode.


Чтобы добавить в заметки выделенный текст, нажмите Ctrl + E
Предыдущий параграф3.3. Базовые приёмы работы в терминале
Следующий параграф3.5. Управление файлами и каталогами