
У меня есть набор папок в одной файловой системе, которые жестко связаны между собой (их содержимое идентично).
Что произойдет, если я перемещу одну из папок в другую файловую систему на другом диске?
Я использую Mac OSX Snow Leopard и использую mv
команду командной строки.
решение1
Нет, по умолчанию mv
так.нетсохранить жесткие ссылки:
~$ который mv /bin/мв ~$ uname -a Darwin mini.local 13.4.0 Версия ядра Darwin 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 test Резервный основной диск $ cd test/ тест$ эхо фу > а тест$ ln ab тест$ ls -li ab 14271856 -rw-r--r-- 2 пользователя staff 4 окт. 15 19:23 a 14271856 -rw-r--r-- 2 пользователя staff 4 окт. 15 19:23 б тест$ cd .. Резервное копирование первичного$ mv test ../Backup\ вторичного/ Резервное копирование первичного$ ls -li ../Backup\ вторичного/test/ всего 32 11040478 -rw-r--r-- 1 пользователь staff 4 окт. 15 19:23 a 11040479 -rw-r--r-- 1 пользователь staff 4 окт. 15 19:23 б
решение2
Примечание
папки в одной файловой системе, которые были жестко связаны друг с другом
Обычно в 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; }
Команда выполняет копирование без удаления. Если вам нужно удалить источник, сделайте это отдельной командой в конце концов.