Работа с файловой системой

Работа с файловой системой #

Андрей Михайлович Васильев, 2024

Версии презентации


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

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

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

diagram

  • Как обеспечить одновременный доступ нескольких процессов?
  • Как обеспечить защиту данных?
  • Как реализовать защиту от потери энергии?

Логическая структура файловой системы #

Для процессов и конечного пользователя была предложена древовидная структура

  • Единицей организации данных является каталог, который может содержать другие файлы и каталоги
  • Первый каталог файловой системы называется корневым
  • В результате формируется древовидная структура файловой системы

diagram

В задачу ОС входит преобразования логического обращения к дререву файловой системы на обращение к последовательности блоков


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

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

  • Приложение — это файл, который располагается где-то в файловой системе
  • Все данные пользователя расположены в файлах: текстовые документы, фотографии, таблицы и так далее
  • Приложения для своей работы используют разделяемые библиотеки, файлы, различные ресурсы (тоже файлы)
  • Приложения используют файлы для хранения собственной конфигурации

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


Структура файловых каталогов #

В Windows существует множество файловых деревьев, для идентификации которых используются названия C, D и так далее

diagram

В UNIX-подобных ОС существует только одно дерево каталогов, различные дисковые разделы подключаются к единому дереву каталогов, начиная с корневого каталога /

diagram


Текущий рабочий каталог #

Для удобства построения путей к нужным файлам была введена концепция текущего рабочего каталога

Без её помощи можно стоить пути только абсолютно, начиная с корневого каталога /

/home/user/my-data/marks.ods

Это соответствует следующей структуре каталогов

/
└── home
    └── user
        └── my-data
            └── marks.ods

С помощью рабочего каталога можно сократить вводимый пользователем путь:

marks.ods

Эти пути будут указывать на один и тот же файл, если текущий рабочий каталог

/home/user/my-data/

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

Путь к файлу = текущий рабочий каталог + относительный путь

/home/user/my-data/ + marks.ods = /home/user/my-data/marks.ods

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

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

Как узнать текущий рабочий каталог #

Команда pwd позволяет узнать текущий рабочий каталог

andrey@hp-laptop:~$ pwd
/home/andrey

/home/andrey — это вывод команды pwd


Как указывать относительные пути к другим каталогам #

Согласно древовидному представлению мы можем двигаться в трёх направлениях:

  • Вверх, к родительскому каталогу
  • Остаться на месте в текущем каталоге
  • Вниз, в один из подкаталогов

Вверх #

Для движения «вверх» необходимо использовать специальный путь: ..

Например для составления пути к файлу data.txt в родительском каталоге необходимо составить относительный путь ../data.txt

Родительский каталог/
├── Рабочий каталог/
│   ├── cute-animals/
│   │   └── cat.png
│   └── picture.png
└── data.txt

Остаться на месте #

Для указания текущего каталога используется специальное название: .

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

  • ./picture.jpg
  • picture.jpg
Родительский каталог/
├── Рабочий каталог/
│   ├── cute-animals/
│   │   └── cat.png
│   └── picture.png
└── data.txt

Спуститься вниз в один из подкаталогов #

Для указания пути к файлу cat.png, расположенному в подкаталоге cute-animals необходимо сформировать: cute-animals/cat.png

Родительский каталог/
├── Рабочий каталог/
│   ├── cute-animals/
│   │   └── cat.png
│   └── picture.png
└── data.txt

Отображение файлов в каталоге #

Для получения информации о файлах в каталоге используется приложение ls

andrey@hp-laptop:~$ ls
 bin           Desktop   Documents     libvirt-images   Postman
 snap ...

Если не давать ей дополнительных аргументов, то можно получить информацию о текущем рабочем каталоге


Скрытые файлы в UNIX #

Согласно соглашению об именах файлы, которые начинаются с символа точки, считаются скрытыми и их приложение ls в своём выводе по умолчанию не показывает

Чтобы увидеть все файлы, включая скрытые необходимо приложению ls передать аргумент -a: ls -a

[andrey@hp-laptop ~]$ ls -a
 .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .cache
 .config  .local .lpoptions  .mutt  .psql_history  .rpmmacros  .ssh
 .wget-hsts  .xprofile  .xsession.d ...
  • Скрытые файлы зачастую содержат конфигурационные файлы приложений
  • Пользователю редко необходимо эти файлы редактировать

Изменение текущего рабочего каталога #

Для изменения текущего рабочего каталога используется команда cd

Для перехода в другой каталог необходимо в качестве аргументу команды cd передать либо абсолютный, либо относительный путь к целевому каталогу

Пример структуры каталогов

/
└── usr
    ├── bin
    ├── doc
    ├── lib
    ├── sbin
    └── share

Использование абсолютных путей #

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

Для перехода в /usr/bin можно написать

cd /usr/bin

Изменение рабочего каталога с относительными путями #

При использовании относительных путей экономим время на набор, но надо быть аккуратным - путь зависит от текущего рабочего каталога

Предположим, что мы находимся в каталоге /usr/bin проведём ряд переходов

Пример структуры каталогов

/
└── usr
    ├── bin
    ├── doc
    ├── lib
    ├── sbin
    └── share
$ pwd
/usr/bin
$ cd .. # Переход в /usr
$ pwd
/usr
$ cd lib # Переход в /usr/lib
$ pwd
/usr/lib
$ cd ../share # Переход в /usr/share
$ pwd
/usr/share

Специальные аргументы команды cd #

Команда cd может также принимать следующие специальные аргументы:

  • - — переход в предыдущий каталог
  • без аргументов — переход в домашний каталог
  • ~bob — переход в домашний каталог пользователя bob

Также можно воспользоваться ~ для указания пути к домашнему каталогу текущего пользователя. Данный путь будет работать везде, не только с командой cd


Особенности файловой системы Linux #

Имена файлов и каталогов зависят от регистра #

Следующие наборы имён в Linux будут разными в отличие от Windows и macOS:

  • File.txt, file.txt
  • DataBase.db, database.DB

Командный интерфейс не различает расширения файлов #

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

В командном интерфейсе реализована другая логика: необходимо вызвать приложение и указать ему файл, который необходимо обработать

Можно вызвать приложение, которое автоматически найдёт приложение по расширению или типу файла, т.е. «нажать» на файл из командного интерфейса


Пробелы в названий файлов и каталогов #

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

Предположим, что мы хотим перейти в каталог с названием cool things и напишем команду cd cool things

Данная команда не будет успешна, т.к. для cd будет передано 2 аргумента: cool и things, а не один

Для решения этой задачи надо либо экранировать пробел:

  • С помощью кавычек: cd 'cool things'
  • С помощью слеша: cd cool\ things

Либо по возможности избегать пробелов в названиях файлов


Автоматическое дополнение пути #

Может показаться, что формировать длинные пути сложно с клавиатуры и неудобно, но это не так. Для ускорения процесса можно воспользоваться клавишей <TAB>, которая позволяет автоматически разрешить путь к каталогу

Рассмотрим следующую структуру каталогов

И построим путь к каталогу path

.
├── another
└── some
    ├── complex
    │   ├── path
    │   └── picture
    └── data
$ cd # начинаем набирать команду cd
$ cd s # нажимаем TAB
$ cd some/ # дополнение
$ cd some/c # вводим c и TAB
$ cd some/complex/ # дополнение
$ cd some/complex/pa # TAB
$ cd some/complex/path

В последнем шаге потребовалось ввести pa, а не p, т.к. существует 2 каталога, которые начинаются на букву p

Если автоматическое дополнение не сработало сразу, то можно нажать на клавишу <TAB> ещё раз и Bash покажет возможные варианты для дополнения

© A. M. Васильев, 2025, CC BY-SA 4.0, andrey@crafted.su