Что происходит при перемещении жестко связанного файла между файловыми системами с использованием `mv`?

У меня есть коллекция папок в одной файловой системе, которые были жестко связаны друг с другом (содержимое идентично).

Что происходит, когда я перемещаю одну из папок в другую файловую систему на другом диске?

Я на Mac OSX снежный барс, и я использую командную строку mv команда.

2 ответа

Нет, по умолчанию mv не сохраняет жесткие ссылки:

~ $ который мв
/ Bin / мв
~$ uname -a
Darwin mini.local 13.4.0 Darwin Kernel Версия 13.4.0: Вс 17 августа 19:50:11 PDT 2014; root: xnu-2422.115.4 ~ 1 / RELEASE_X86_64 x86_64

~ $ cd / Volumes / Backup \ primary /
Резервное копирование основного теста $ mkdir
Резервное копирование основного теста $ cd /
test$ echo foo > a
проверить $ ln a b
проверить $ ls -li a b
14271856 -rw-r- r-- 2 пользователя 4 октября 15 19:23
14271856 -rw-r - r-- 2 пользователя 4 октября 15 19:23 б
проверить $ cd..
Резервное копирование основного теста $ mv../ Резервное копирование \ Дополнительное /
Резервное копирование первичного $ ls -li../ Резервное копирование \ вторичное / test /
всего 32
11040478 -rw-r- r-- 1 пользовательский персонал 4 октября 15 19:23 a
11040479 -rw-r- r-- 1 пользовательский персонал 4 октября 15 19:23 b

Заметка

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

Обычно в Unix жесткие ссылки на каталоги вместе не поддерживаются. Я предполагаю, что вы имеете в виду "файлы в одном каталоге являются жесткими ссылками на файлы в другом каталоге".


mv поведение

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

Сравните этот ответ Unix & Linux SE. Соответствующая часть:

Переход между файловыми системами (не имеет значения, находится ли он на одном физическом носителе или нет) обрабатывается как копия файла с последующим удалением. Это на самом деле именно то, что mv команда делает. Очевидно, это означает, что файловая система назначения должна создать новую копию файла.

После того, как копия сделана, mv удаляет источник аналогично rm, Это относится:

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

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

Если вы переместите все жестко связанные файлы, они все исчезнут из исходной файловой системы и появятся в целевой. Имейте в виду, что даже один mv (перемещение нескольких файлов) будет создавать каждый новый файл отдельно, они больше не будут жестко связаны друг с другом. Теоретически mv может выполнить некоторую дополнительную работу по обнаружению жестких ссылок и воссозданию их в целевой файловой системе, но это не так (как показано в этом другом ответе).


Перемещение жестких ссылок для получения жестких ссылок

Есть и другие инструменты, которые воссоздают жесткие ссылки, tar является одним из них (хотя я не могу сказать, если tar на Mac OS X это точно). Сравните это:

По умолчанию, если вы скажете tar архивировать файл с жесткими ссылками, и среди архивируемых файлов имеется более одной такой ссылки, он архивирует файл только один раз и записывает вторую (и любые дополнительные имена) как жесткие ссылки. Это означает, что при извлечении этого архива жесткие ссылки будут восстановлены.

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

Чтобы воспользоваться tar без создания большого архива вам нужно несколько трюков с оболочкой. Например:

tar -c /source/dirA/ /source/file1  | { cd /foo/destination/ && tar -x; }

Команда выполняет копирование без удаления. Если вам нужно удалить источник, сделайте это с помощью отдельной команды.

Другие вопросы по тегам