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

451
b20000

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

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

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

1
в частности, я пытаюсь понять, скопирует ли команда mv данные в новую файловую систему и удалит ли она тогда одну коллекцию жестких ссылок из исходной файловой системы и т. д. 11 лет назад 0
При пересечении файловых систем `mv` может только сделать копию, а затем удалить процесс. Я не знаю MacOS, но сделаю `man ls` и посмотрим, какие параметры вам нужны для просмотра` ​​inodes`. Что касается системы * nix, `inodes '- это файл, а имена - это просто указатели на него. Вот что делает возможным создание жестких ссылок. Jeremy J Starcher 11 лет назад 2

2 ответа на вопрос

0
chlunde

Нет, по умолчанию 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 ab проверить $ ls -li ab 14271856 -rw-r - r-- 2 пользователя 4 октября 15 19:23 14271856 -rw-r - r-- 2 пользователя 4 октября 15 19:23 б проверить $ cd .. Резервное копирование основного теста $ mv ../ Резервное копирование \ Дополнительное / Резервное копирование основного $ ls -li ../ Резервное копирование \ Дополнительное / тестирование / всего 32 11040478 -rw-r - r-- 1 пользовательский персонал 4 октября 15 19:23 a 11040479 -rw-r - r-- 1 пользовательский персонал 4 октября 15 19:23 b 
0
Kamil Maciorowski

Заметка

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

Обычно в 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; } 

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