Дерево

Файловай система в Unix/Linux организована в виде дерева:

  • вершинами этого дерева являются файлы
    • директория/каталог — это тоже файл, он содержит список файлов, которые в директории находятся;
      можно считать, что вершины в дереве, у которых есть потомки — это директории
  • корнем дерева является директория /, её так и называют “корень”

Пример дерева:

/
├── bin -> usr/bin
├── boot
│   ├── grub
│   └── lost+found
├── dev
├── etc
├── home
├── lib -> usr/lib
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

Первые команды для работы с файловой системой

С каждой программой в Unix/Linux связана текущая директория этой программы.

В т.ч. в shell можно посмотреть текущую директорию, в которой сейчас работаем:

pwd

С помощью ls(1) без аргументов можно выяснить содержимое текущей директории:

ls
## вывод 

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

В каждой директории обязательно находятся две особых: . — это сама она же, .. — её родительская.

Ранняя реализация ls хотела скрыть их из вывода такой проверкой:

if (name[0] == '.') continue;

Другие программисты посчитали, что это означает, что файлы, имя которых начинается с точки, — скрытые. Так пошла традиция.


ls -a

показывает полное содержимое директории, включая все скрытые файлы.

Пути и имена

Корневой каталог / является началом файловой системы.

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

Путь к файлу от корня файловой системы называется абсолютным путём.

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

/boot/grub

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

Относительный путь — это такой путь, который не начинается в корне /.

Пример относительного пути:

a/tasks/README.md

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

Примеры

С cd перейдём в директорию /usr/bin, пользуясь абсолютным путём:

cd /usr/bin/
pwd
## вывод
/usr/bin/

Теперь хитрым способом никуда не переместимся (да, просто останемся в той же директории):

cd ../bin/./././../../usr/bin

Поймите почему мы остались в той же директории.

pwd
## вывод
/usr/bin/

И всё-таки перейдём в корневую директорию:

cd ../..
pwd
## вывод
/

Допустимые символы в имени

Обратите внимание, что в именах файла явно запрещены только правый слеш / и null-byte: \0. Остальные символы разрешены и допустимы.

Так, например, можно создать файл с пробелом в имени или даже с символом переноса строки.

Неправильная обработка таких путей средствами shell может привести к проблемам и некорретной работе ваших скриптов.

Создание, удаление и изменение файлов

  • mkdir - для создания новых директорий
  • rmdir - для удаления пустых директорий
  • rm - для удаления файлов или директорий
mkdir /home/user1/newfolder
rm /home/user1/oldfile.txt

rmdir предпочтительнее использовать для удаления директорий — она удаляет только пустые директории.

Также у этих утилит есть различные и крайне полезные флаги. Обязательно изучайте man-страницы.

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

Или же можно перенаправить в файл вывод какой-нибудь программы.

Ссылки

inode

У каждого файла в системе есть свой уникальный номер, известный как inode. Этот номер используется для идентификации файла на файловой системе.

Мягкие и жёсткие ссылки

Жесткие ссылки (Hard-Link)

Это дополнительное имя для существующего файла. Жёсткая ссылка ссылается на тот же inode, что и оригинальный файл.

ln original hardlink

задаст жёсткую ссылку

Символьные ссылки (Symbolic Link)

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

ln -s original symlink

создаст символьную ссылку.

Всё есть файл

Концепция “всё есть файл” в Unix-подобных системах означает, что большинство взаимодействий с данными осуществляется через файловые абстракции. Файлы, каталоги, устройства, сетевые соединения и даже некоторые внутренние системные ресурсы представлены в виде файлов. Это позволяет использовать стандартные инструменты для чтения, записи и управления практически любыми данными.

Типы файлов

  • Обычные файлы: Это текстовые файлы, медиафайлы, исполняемые файлы и т.д.
  • Каталоги: Представляют собой файлы, которые содержат ссылки на другие файлы или каталоги.
  • Блочные устройства: Например, жесткие диски, представлены файлами, через которые осуществляется доступ к данным на этих устройствах.
  • Символьные устройства: Например, принтеры, управляются через файлы, представляющие устройства.
  • Символические ссылки: Файлы, которые служат указателями на другие файлы.
  • Каналы межпроцессного взаимодействия (PIPE, FIFO) и гнезда: Используются для обмена данными между процессами.
  • другие.

Именитые примеры: /proc and /dev

В Unix и Linux системах, /proc и /dev являются хорошими примерами этой концепции.

Они дают доступ к системной информации и устройствам.

/proc

Этот каталог содержит виртуальную файловую систему, которая предоставляет информацию о процессах и ресурсах системы. Например:

  • Чтение информации о CPU: cat /proc/cpuinfo
  • Просмотр использования памяти: cat /proc/meminfo
  • Доступ к информации о конкретном процессе: ls /proc/[pid]

/dev

Каталог /dev содержит специальные файлы, которые представляют устройства. Примеры взаимодействия:

  • Чтение данных с первого жесткого диска: cat /dev/sda
  • Запись данных на USB-устройство: cat file > /dev/sdb1
  • Просмотр списка доступных устройств: ls /dev/

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

  • /proc: Виртуальная файловая система, предоставляющая доступ к информации о процессах и системных ресурсах.
  • /dev: Содержит файлы устройств, представляющие аппаратные и виртуальные устройства в системе.

Что дальше?

Как минимум, можно изучить:

  • find: Инструмент для поиска файлов.
  • Глобы: Шаблоны для соответствия именам файлов в командной строке.