Введение
В этой лабораторной работе вы освоите базовые навыки управления файлами и директориями в среде командной строки 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). Редактор запускается в командном режиме, где нажатия клавиш интерпретируются как команды. Чтобы начать вводить текст, нужно перейти в режим вставки.
- В терминале (убедитесь, что вы находитесь в
~/project) запуститеviдля создания файлаfilea:
vi filea
- Откроется интерфейс редактора
vi. Чтобы начать ввод текста, перейдите в режим вставки, нажав клавишуi. В нижней части экрана может появиться надпись-- INSERT --. - Введите следующий текст:
This is filea.
- Чтобы сохранить файл и выйти из
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.
- Запустите
vi:vi filea - Нажмите
iдля перехода в режим вставки. - Введите новый текст:
This is the new filea. - Нажмите
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.
- Сначала создайте простой файл для работы с помощью команды
touch.touchсоздает пустой файл, если он еще не существует.
touch source_file
- Теперь посмотрим на его свойства, обращая внимание на номер inode (первая колонка).
ls -i source_file
Вывод покажет уникальный номер inode для этого файла.
131081 source_file
- Далее скопируем
source_fileв новый файл с именемcopied_file.
cp source_file copied_file
- Теперь выведите свойства обоих файлов.
ls -i source_file copied_file
Вы увидите, что это два разных файла с разными номерами inode.
131082 copied_file
131081 source_file
Перемещение и переименование файлов с помощью mv
Команда mv универсальна. Если целью является новое имя файла в той же директории, она переименовывает файл. Если целью является директория, она перемещает файл в неё. При переименовании или перемещении файла в пределах одной файловой системы номер inode не меняется; команда просто обновляет имя файла или указатель на его местоположение.
- Переименуем
source_fileвrenamed_file.
mv source_file renamed_file
- Проверьте inode переименованного файла.
ls -i renamed_file
Вы заметите, что номер inode (например, 131081) остался таким же, как у исходного source_file. Сам файл не изменился, изменилось только его имя.
131081 renamed_file
- Теперь переместим этот файл. Сначала создадим целевую директорию.
mkdir move_destination
- Переместите
renamed_fileв директориюmove_destination.
mv renamed_file move_destination/
- Убедитесь, что файл теперь находится внутри папки, и снова проверьте его inode.
ls -i move_destination/renamed_file
Номер inode остался прежним, что подтверждает: файл был перемещен, а не скопирован.
131081 move_destination/renamed_file
Обработка перезаписи
По умолчанию во многих системах для команды cp настроен псевдоним (alias) cp -i, чтобы предотвратить случайную перезапись существующих файлов. Флаг -i означает «interactive» (интерактивный).
- Попробуем скопировать
copied_fileповерх файла внутри нашей директорииmove_destination.
cp -i copied_file move_destination/renamed_file
- Благодаря флагу
-iсистема запросит подтверждение.
cp: overwrite 'move_destination/renamed_file'?
Введите y и нажмите Enter, чтобы подтвердить перезапись. Если бы вы захотели отменить операцию, нужно было бы ввести n.
Резюме
В этой лабораторной работе вы изучили основные команды для управления файлами и директориями в среде Linux. Вы попрактиковались в создании структур директорий с помощью mkdir (включая использование флага -p для родительских папок) и их удалении с помощью rmdir для пустых папок и rm для непустых. Вы также создавали файлы в редакторе vi и познакомились с концепцией ссылок.
Основная часть работы была посвящена созданию и анализу двух типов ссылок: символических (мягких) с помощью ln -s и жестких с помощью ln. Вы изучили их ключевые различия, исследуя индексовые дескрипторы (inodes) и наблюдая за поведением ссылок при изменении или удалении исходного файла. Наконец, вы использовали команду cp для создания независимых копий файлов и команду mv для перемещения или переименования файлов и директорий, завершив комплексный обзор важнейших операций по управлению файлами.



