Управление файлами и директориями в Linux

CompTIABeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы освоите базовые навыки управления файлами и директориями в среде командной строки Linux. Вы получите практический опыт создания и удаления сложных структур директорий с помощью mkdir и rm, а также научитесь копировать и перемещать файлы и папки, используя cp и mv.

Кроме того, данная работа предлагает детальное изучение механизмов связывания файлов. Вы создадите как символические (мягкие), так и жесткие ссылки с помощью команды ln, проанализируете концепцию индексовых дескрипторов (inodes) и проследите, как ведут себя ссылки разных типов при изменении исходного файла. Это поможет вам глубже понять, как файловая система Linux организует данные и ссылается на них.

Создание и удаление структур директорий с помощью mkdir, rmdir и rm

На этом этапе вы научитесь создавать и удалять директории. Организация файлов в иерархическую структуру папок — это фундаментальная задача в Linux. Мы будем использовать команду mkdir для создания директорий, rmdir для удаления пустых папок и rm для удаления директорий вместе со всем их содержимым. Все команды будут выполняться из вашей рабочей директории по умолчанию: ~/project.

Для начала создадим простую директорию. Название команды mkdir расшифровывается как «make directory» (создать директорию).

Выполните в терминале следующую команду, чтобы создать папку с именем cars:

mkdir cars

Чтобы убедиться, что директория создана, воспользуйтесь командой ls -ld. Флаг -l выводит подробный список, а флаг -d заставляет команду показать саму директорию, а не её содержимое.

ls -ld cars

Вы должны увидеть вывод, похожий на этот, подтверждающий создание папки cars. Символ d в начале строки прав доступа указывает на то, что это директория (directory).

drwxr-xr-x 2 labex labex 4096 May 20 10:30 cars

Теперь удалим эту директорию. Команда rmdir используется исключительно для удаления пустых директорий.

rmdir cars

Проверьте удаление, снова выполнив команду ls -ld.

ls -ld cars

На этот раз вы получите сообщение об ошибке, так как директория больше не существует. Это подтверждает, что rmdir сработала успешно.

ls: cannot access 'cars': No such file or directory

Команда rmdir работает только с пустыми папками. Но что если нам нужно создать структуру вложенных директорий? Попробуем создать путь pastry/pies/cakes. Чтобы автоматически создать все необходимые родительские папки, нужно использовать флаг -p (parents) с командой mkdir.

Выполните следующую команду:

mkdir -p pastry/pies/cakes

Чтобы просмотреть всю созданную структуру, используйте команду ls с флагами -l (подробный формат) и -R (рекурсивно).

ls -lR pastry

В выводе отобразится директория pastry и её поддиректории pies и cakes.

pastry:
total 4
drwxr-xr-x 3 labex labex 4096 May 20 10:35 pies

pastry/pies:
total 4
drwxr-xr-x 2 labex labex 4096 May 20 10:35 cakes

pastry/pies/cakes:
total 0

Теперь попробуем удалить директорию pastry с помощью rmdir.

rmdir pastry

Почему команда не сработала? Терминал выдаст ошибку:

rmdir: failed to remove 'pastry': Directory not empty

Это происходит потому, что rmdir может удалять только пустые папки, а pastry содержит поддиректорию pies.

Чтобы удалить директорию вместе со всем содержимым (включая поддиректории и файлы), необходимо использовать команду rm с флагом -r (recursive — рекурсивно). Будьте предельно осторожны с этой командой, так как она безвозвратно удаляет данные.

rm -r pastry

При успешном выполнении эта команда ничего не выводит. Вы можете убедиться, что папка pastry полностью удалена, снова запустив ls -ld pastry — вы должны получить ошибку «No such file or directory».

ls -ld pastry

Создание файлов и символических ссылок с помощью vi и ln -s

На этом этапе вы создадите файл с помощью текстового редактора vi, а затем создадите на него символическую ссылку. Символическая ссылка (symlink или soft link) — это специальный тип файла, который указывает на другой файл или директорию. Это аналог ярлыка в других операционных системах.

Сначала создадим простой текстовый файл filea с помощью vi. vi — это мощный экранный текстовый редактор. У него есть два основных режима: командный режим (Command mode) и режим вставки (Insert mode). Редактор запускается в командном режиме, где нажатия клавиш интерпретируются как команды. Чтобы начать вводить текст, нужно перейти в режим вставки.

  1. В терминале (убедитесь, что вы находитесь в ~/project) запустите vi для создания файла filea:
vi filea
  1. Откроется интерфейс редактора vi. Чтобы начать ввод текста, перейдите в режим вставки, нажав клавишу i. В нижней части экрана может появиться надпись -- INSERT --.
  2. Введите следующий текст:
This is filea.
  1. Чтобы сохранить файл и выйти из vi, сначала вернитесь в командный режим, нажав клавишу Esc. Затем введите ZZ (зажмите Shift и дважды нажмите Z). Эта команда сохраняет изменения и закрывает редактор.

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

Сначала выведите список файлов:

ls filea

Выводом должно быть просто имя файла:

filea

Затем выведите его содержимое с помощью команды cat:

cat filea

Вывод должен соответствовать введенному вами тексту:

This is filea.

Теперь создадим символическую ссылку. Мы создадим ссылку с именем fileb, которая будет указывать на наш исходный файл filea. Используется команда ln -s <исходный_файл> <имя_ссылки>.

ln -s filea fileb

Чтобы проверить результат, используйте команду ls -il. Флаг -i показывает номер inode (индексового дескриптора) — уникального идентификатора файла или директории в файловой системе.

ls -il file[ab]

Внимательно изучите вывод.

131075 -rw-r--r-- 1 labex labex 14 May 20 10:40 filea
131076 lrwxrwxrwx 1 labex labex  5 May 20 10:41 fileb -> filea

Обратите внимание на несколько важных моментов:

  • Тип файла: Строка прав доступа для filea начинается с -, что означает обычный файл. Строка для fileb начинается с l, что указывает на символическую ссылку (link).
  • Указатель ссылки: В выводе наглядно показано fileb -> filea.
  • Номера Inode: Посмотрите на первую колонку. Номера inode у filea и fileb разные. Почему? Потому что символическая ссылка — это отдельный файл, в котором просто хранится путь к целевому файлу. Это не сам файл, поэтому он получает свой уникальный номер inode.

Наконец, проверим, можем ли мы прочитать содержимое через ссылку.

cat fileb

Выводом будет содержимое файла filea:

This is filea.

Это ожидаемое поведение. Когда вы выполняете операцию (например, cat) над символической ссылкой, система автоматически переходит по ссылке к исходному файлу и выполняет операцию над ним.

Создание и анализ жестких ссылок с помощью ln и Inodes

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

Мы продолжим работу с файлами filea и fileb в директории ~/project.

Сначала создадим жесткую ссылку с именем filec, которая будет указывать на тот же inode, что и filea. Для этого используется команда ln без флага -s.

ln filea filec

Теперь просмотрим содержимое всех трех файлов: оригинала filea, символической ссылки fileb и новой жесткой ссылки filec.

cat filea
cat fileb
cat filec

Вы увидите один и тот же текст трижды, что вполне логично.

This is filea.
This is filea.
This is filea.

Реальная разница становится очевидной при проверке свойств файлов. Снова используйте команду ls -il, чтобы увидеть номера inode и другие детали для всех трех файлов.

ls -il file[a-c]

Вывод будет выглядеть примерно так. Обратите особое внимание на первую и вторую колонки.

131075 -rw-r--r-- 2 labex labex 14 May 20 10:40 filea
131076 lrwxrwxrwx 1 labex labex  5 May 20 10:41 fileb -> filea
131075 -rw-r--r-- 2 labex labex 14 May 20 10:40 filec

Разберем этот вывод:

  • Номера Inode (Колонка 1): Заметьте, что у filea и filec абсолютно одинаковый номер inode (например, 131075). Это определяющая характеристика жесткой ссылки. Это не разные файлы; это два разных имени, указывающих на идентичные данные файла на диске. Символическая ссылка fileb имеет свой собственный уникальный inode.
  • Счетчик ссылок (Колонка 2): Посмотрите на число для filea и filec. Теперь оно равно 2. Это счетчик жестких ссылок, который отслеживает, сколько имен (жестких ссылок) указывают на этот конкретный inode. Когда вы создали filec, счетчик ссылок для этого inode увеличился с 1 до 2.
  • Тип файла (Первый символ прав доступа): Обратите внимание, что filec значится как обычный файл (права начинаются с -), так же как и filea. Это не специальный тип ссылки, в отличие от fileb (где стоит l).

Наблюдение за поведением ссылок после изменения исходного файла

На этом этапе вы увидите критические различия в поведении символических и жестких ссылок при удалении и последующем воссоздании исходного файла. Это закрепит ваше понимание принципов работы каждого типа ссылок. Мы продолжим использовать filea, fileb и filec в директории ~/project.

Сначала удалим исходный файл filea.

rm filea

Теперь проверим состояние наших трех файлов с помощью команды ls -l. Скорее всего, вы увидите ошибку для filea, так как он больше не существует.

ls -l file[a-c]

Результат будет весьма показательным:

ls: cannot access 'filea': No such file or directory
lrwxrwxrwx 1 labex labex 5 May 20 10:41 fileb -> filea
-rw-r--r-- 1 labex labex 14 May 20 10:40 filec
  • Символическая ссылка fileb: Ссылка теперь «битая» (broken). Она по-прежнему указывает на имя filea, но это имя больше не связано ни с каким существующим файлом. Во многих терминалах имя fileb будет подсвечено красным цветом, сигнализируя о нерабочем состоянии. Если вы попытаетесь выполнить cat fileb, вы получите ошибку.
  • Жесткая ссылка filec: Файл filec никак не пострадал. Его счетчик ссылок (вторая колонка) просто уменьшился с 2 до 1, но сам файл и его данные остались на месте. Это происходит потому, что удаление filea убрало лишь одно из имен, указывающих на inode; данные не удаляются до тех пор, пока счетчик ссылок не упадет до нуля. Вы можете убедиться в этом, просмотрев содержимое:
cat filec

Вывод по-прежнему содержит исходный текст:

This is filea.

Теперь воссоздадим filea, но с другим содержимым. Используйте vi, чтобы создать новый файл с именем filea.

  1. Запустите vi: vi filea
  2. Нажмите i для перехода в режим вставки.
  3. Введите новый текст: This is the new filea.
  4. Нажмите Esc для возврата в командный режим, затем введите ZZ для сохранения и выхода.

Теперь, когда новый filea на месте, снова проверим все три файла с помощью ls -il.

ls -il file[a-c]

Вывод покажет новую ситуацию:

131080 -rw-r--r-- 1 labex labex 20 May 20 11:05 filea
131076 lrwxrwxrwx 1 labex labex  5 May 20 10:41 fileb -> filea
131075 -rw-r--r-- 1 labex labex 14 May 20 10:40 filec
  • Новый filea: Файл filea снова существует, но обратите внимание, что его номер inode (например, 131080) отличается от inode файла filec (например, 131075). Это совершенно новый файл, который просто имеет то же имя, что и старый.
  • Символическая ссылка fileb: Ссылка больше не битая! Она автоматически указывает на новый файл с именем filea.
  • Жесткая ссылка filec: filec остался без изменений. Он по-прежнему указывает на оригинальный inode и содержит исходные данные.

Наконец, проверим содержимое всех трех файлов.

cat filea
cat fileb
cat filec

Результат наглядно демонстрирует разницу:

This is the new filea.
This is the new filea.
This is filea.

Символическая ссылка fileb последовала за именем к новому файлу, в то время как жесткая ссылка filec сохранила связь с исходными данными.

Копирование и перемещение файлов с помощью cp и mv

На этом заключительном этапе вы научитесь использовать команды cp (copy — копировать) и mv (move — переместить), которые необходимы для управления файлами. Команда cp создает дубликат файла или директории, а команда mv либо переименовывает файл/директорию, либо перемещает их в другое место.

Для начала очистим рабочее пространство от файлов предыдущих шагов. Все команды выполняются в директории ~/project.

rm filea fileb filec

Копирование файлов с помощью cp

Команда cp создает новую независимую копию файла. У нового файла будет свой собственный inode.

  1. Сначала создайте простой файл для работы с помощью команды touch. touch создает пустой файл, если он еще не существует.
touch source_file
  1. Теперь посмотрим на его свойства, обращая внимание на номер inode (первая колонка).
ls -i source_file

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

131081 source_file
  1. Далее скопируем source_file в новый файл с именем copied_file.
cp source_file copied_file
  1. Теперь выведите свойства обоих файлов.
ls -i source_file copied_file

Вы увидите, что это два разных файла с разными номерами inode.

131082 copied_file
131081 source_file

Перемещение и переименование файлов с помощью mv

Команда mv универсальна. Если целью является новое имя файла в той же директории, она переименовывает файл. Если целью является директория, она перемещает файл в неё. При переименовании или перемещении файла в пределах одной файловой системы номер inode не меняется; команда просто обновляет имя файла или указатель на его местоположение.

  1. Переименуем source_file в renamed_file.
mv source_file renamed_file
  1. Проверьте inode переименованного файла.
ls -i renamed_file

Вы заметите, что номер inode (например, 131081) остался таким же, как у исходного source_file. Сам файл не изменился, изменилось только его имя.

131081 renamed_file
  1. Теперь переместим этот файл. Сначала создадим целевую директорию.
mkdir move_destination
  1. Переместите renamed_file в директорию move_destination.
mv renamed_file move_destination/
  1. Убедитесь, что файл теперь находится внутри папки, и снова проверьте его inode.
ls -i move_destination/renamed_file

Номер inode остался прежним, что подтверждает: файл был перемещен, а не скопирован.

131081 move_destination/renamed_file

Обработка перезаписи

По умолчанию во многих системах для команды cp настроен псевдоним (alias) cp -i, чтобы предотвратить случайную перезапись существующих файлов. Флаг -i означает «interactive» (интерактивный).

  1. Попробуем скопировать copied_file поверх файла внутри нашей директории move_destination.
cp -i copied_file move_destination/renamed_file
  1. Благодаря флагу -i система запросит подтверждение.
cp: overwrite 'move_destination/renamed_file'?

Введите y и нажмите Enter, чтобы подтвердить перезапись. Если бы вы захотели отменить операцию, нужно было бы ввести n.

Резюме

В этой лабораторной работе вы изучили основные команды для управления файлами и директориями в среде Linux. Вы попрактиковались в создании структур директорий с помощью mkdir (включая использование флага -p для родительских папок) и их удалении с помощью rmdir для пустых папок и rm для непустых. Вы также создавали файлы в редакторе vi и познакомились с концепцией ссылок.

Основная часть работы была посвящена созданию и анализу двух типов ссылок: символических (мягких) с помощью ln -s и жестких с помощью ln. Вы изучили их ключевые различия, исследуя индексовые дескрипторы (inodes) и наблюдая за поведением ссылок при изменении или удалении исходного файла. Наконец, вы использовали команду cp для создания независимых копий файлов и команду mv для перемещения или переименования файлов и директорий, завершив комплексный обзор важнейших операций по управлению файлами.