Дерево
Файловай система в 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: Содержит файлы устройств, представляющие аппаратные и виртуальные устройства в системе.
Что дальше?
Как минимум, можно изучить: