Урок 7. Копирование файлов и каталогов, жесткие и символьные ссылки

Рассмотрим как можно копировать файлы в системах Линукс, а также узнаем что такое символьные и жесткие ссылки и чем они могут быть полезны.

Копирование файлов

Команда довльно проста: cp файл_источник целевой_файл.

Например, создадим копию файла test.txt под названием test_copy.txt

Создание копии файла
Рис. 1. Создание копии файла

Исходный файл сохранился, кроме того у нас имеется его копия.

А если в качестве целевого файла указать существующий файл?

Тогда этот файл будет перезаписан. Чтобы этого не произошло удобно использовать опцию -i (--interactive). Работает также, как и с командой mv - запрашивает у пользователя подтверждение действия.

А можно копировать файл в каталог?

 Да, для этого в качестве целевого файла укажите сам каталог. Например, скопируем файл test.txt в каталог home/student/video/: cp test.txt home/student/video  или просто cp test.txt video/

Копирование файла в каталог
Рис. 2. Копирование файла в каталог

А можно этой командой копировать каталоги со всем содержимым?

Да, но для этого используется специальная опция -R (--recursive): cp -R каталог_источник целевой_каталог.

Кстати, у скопированной копии права доступа и прочие атрибуты файла определяются в соответствии с атрибутами самого пользователя, скопировавшего файл. Чтобы сохранить первоначальные атрибуты необходимо использовать опцию -p (--preserve).

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

-f (--force)

-u (--update)

-v (--verbose)

 Как они работают вы уже знаете.

 

Создание ссылок

Как вы уже знаете в системе Linux существуют 2 типа ссылок: жесткие и символьные.

Поговорим сначала о жестких ссылках.

Содержимое любого файла хранится на определенных секторах запоминающего устройства (жесткого диска, USB флэш, CD). Для обращения к этим областям памяти и используются жесткие ссылки, которые и называются именами файла. 

То есть жесткая ссылка и имя файла это одно и то же?

Да, так и есть. Содержимое файла да и сам файл ничего не знают о присвоенных ему именах и ссылках, Поэтому можно создавать какие угодно имена/ссылки и в каком угодно количестве.

То есть можно создать 2 и более имени одного и того же файла?

Совершенно верно. Для этого существует команда ln (сокращенно от link - связывать): ln файл жесткая_ссылка.

Например, создадим ссылку для файла student.txt:

Создание жесткой ссылки
Рис. 3. Создание жесткой ссылки

Существует и другая форма записи команды ln: ln файл каталог.

С помощью нее создается жесткая ссылка в указанном существующем каталоге:

Создание жесткой ссылки в каталоге
Рис. 4. Создание жесткой ссылки в каталоге

Как видно система создала ссылку с таким же именем.

Важно знать, что в Linux файлы не привязываются к своим именам. У каждого файла есть индексный дескриптор - описание файла, которое содержит всю информацию о файле:

    • тип файла
    • время создания и модификации
    • владелец файла
    • права доступа
    • размер файла
    • идентификатор файла, то есть знает в какой области памяти хранится файл

 

Чтобы обратиться к файлу необходимо указать его идентификатор-метку. Но запоминать все метки нереально, поэтому и используются жесткие ссылки или имена.

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

А как узнать идентификатор файла?

С помощью ls -i либо ls --inod:

Отображение идентификатора файла
Рис. 5. Отображение идентификатора файла

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

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

С помощью идентификатора можно определить файлы с одинаковым содержимым
Рис. 6. С помощью идентификатора можно определить файлы с одинаковым содержимым

У жестких ссылок есть некоторые недостатки:

    • нельзя создать ссылку на несуществующий файл
    • нельзя создать ссылку на каталог
    • нельзя создать ссылку на файл, который находится в другой файловой системе, например, на флэшке или в другом сетевом диске.

А как обойти все эти ограничения?

Легко. Для этого существуют символьные ссылки. Символьная ссылка это просто файл, который содержит путь к указанному файлу или каталогу. Создается она с помощью команды  ln -s файл название_ссылки либо ln --symbolic файл название_ссылки.
Создадим ссылку на файл test.txt

Создание символьной ссылки
Рис. 7. Создание символьной ссылки

Знак -> означает, что данный файл является символьной ссылкой. За знаком следует файл, на который ссылается ссылка. Чтобы узнать полный путь ссылки воспользуемся командой realpath:

Отображение полного пути ссылки
Рис. 8. Отображение полного пути ссылки

А с каким идентификатором будет связана данная ссылка?

Сейчас узнаем:

Связь файла с символьной ссылкой по идентификатору
Рис. 9. Связь файла с символьной ссылкой по идентификатору

Как видно из рисунка индексный дескриптор и прочие атрибуты файлов у них разные. Таким образом, данный тип ссылок даже не связан с индексным дескриптором файла, на который он ссылается.

С командой ln используются следующие опции:

-f (--force) - принудительная перезапись ссылок без оповещения

-b (--backup) - создание резервных копий файла