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

Автор: Кирилл Шевчук

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

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

Ключевые вопросы статьи

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

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

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

Важно

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

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

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

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

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

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

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

Пример:

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

Важно

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

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

/
├── bin/
├── etc/
├── home/
│ └── alice/
│ └──── Documents/
└── 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, то получали путь к домашнему каталогу текущего пользователя:

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

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

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

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

/home/alice/Documents/report.txt

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

/
├── bin/
├── etc/
├── home/
│   └── alice/
│       └── Documents/
│           └── report.txt
└── var/

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

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

alice@ubuntu:~$ pwd
/home/alice

Примечание

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

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

alice@ubuntu:~$ cd Documents

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

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

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

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

Важно

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

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

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

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

alice@ubuntu:~$ mkdir Documents

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

alice@ubuntu:~$ cd Documents
alice@ubuntu:~/Documents$ pwd
/home/alice/Documents

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

alice@ubuntu:~$ cd /home/alice/Documents
alice@ubuntu:~/Documents$ pwd
/home/alice/Documents

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

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

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

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

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

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

alice@ubuntu:~$ cd /
alice@ubuntu:/$ pwd
/

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

alice@ubuntu:/$ cd ~
alice@ubuntu:~$ pwd
/home/alice

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Важно

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

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

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

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

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

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

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

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

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

alice@ubuntu:~$ cat ~/.bash_history

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

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

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

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

Ссылки

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

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

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

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

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

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

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

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

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

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

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

alice@ubuntu:~$ ls -l

lrwxrwxrwx 1 alice alice 10 Oct  6 12:51 report-link -> report.txt
-rw-rw-r-- 1 alice alice 26 Oct  6 12:47 report.txt

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

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

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

alice@ubuntu:~$ cat report-link
Important report contents

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

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

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

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

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

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

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

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

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

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

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

alice@ubuntu:~$ ls -l

-rw-rw-r-- 2 alice alice 34 Oct  6 13:06 new-report.txt
lrwxrwxrwx 1 alice alice 10 Oct  6 12:51 report-link -> report.txt
-rw-rw-r-- 2 alice alice 34 Oct  6 13:06 report.txt

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

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

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

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

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

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

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

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

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

alice@ubuntu:~$ ls -il

524303 -rw-rw-r-- 2 alice alice 39 Oct  6 13:22 new-report.txt
524306 lrwxrwxrwx 1 alice alice 10 Oct  6 12:51 report-link -> report.txt
524303 -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

Ссылки и inode

Важно

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

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

Характеристика Жёсткая ссылка (ln) Символьная ссылка (ln -s)
На что указывает inode (фактические данные) путь к другому файлу
При удалении оригинала данные остаются доступны ссылка ломается
Может ссылаться на каталог нет да
Может ссылаться на файл на другом диске нет да
Как выглядит в ls -l обычный файл, без -> виден как link -> target
Количество ссылок (ls -l) увеличивает не изменяет

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

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

Что дальше

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

В следующей статье вы узнаете:

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

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

Ключевые выводы по статье

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