![Что делает mv в случае ошибок?](https://rvso.com/image/23928/%D0%A7%D1%82%D0%BE%20%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D1%82%20mv%20%D0%B2%20%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B5%20%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA%3F.png)
Я только что попытался переместить большое дерево с одного диска на другой, который оказался слишком маленьким. Теперь у меня осталось что-то, чего я не могу понять - похоже, что некоторые файлы действительно были перемещены из исходного дерева, а другие просто скопированы. Скорее всего, это неправда, и я просто что-то упускаю из виду, как я это сделал, когда проверял свободное место на целевом диске. :D
Команда была просто mv source-dir destination-dir
, где оба каталога находятся на разных дисках. Я использую mv (GNU coreutils) 7.4
. Нигде в man-странице я не нашел ответов на следующие вопросы:
- могут ли создаваться обрезанные файлы?
- В случае ошибок будет ли что-либо удалено в исходном дереве?
- как восстановиться (легко и быстро)?
решение1
Когда mv перемещается в другую файловую систему, он сначала копирует все данные в новую файловую систему. После копирования новых данных он удаляет старые данные. Это означает, что если перемещение прервано или не удалось, исходное местоположение должно по-прежнему содержать все данные.
Что касается восстановления, то повреждены должны быть только данные назначения. Вместо того, чтобы снова использовать mv, просто используйте rsync, а затем rm вручную
rsync -av source-dir/ dest-dir/
rm -rf source-dir
решение2
Я думаю, что вступление к info
странице ответит на все ваши вопросы:
Сначала он использует часть того же кода, который используется `cp -a' для копирования запрошенных каталогов и файлов, затем (предполагая, что копирование прошло успешно) он удаляет оригиналы. Если копирование не удается, то часть, которая была скопирована в целевой раздел, удаляется. Если вы копируете три каталога из одного раздела в другой и копирование первого каталога прошло успешно, а второго — нет, первый останется в целевом разделе, а второй и третий — в исходном разделе.
Восстановление не должно быть проблемой, так как данные сохранены. Я не знаю, насколько он пытается бытьатомный( mkdir
например, требуется проверка исходного кода) или если это вообще в его области (по сравнению с ядром), но может произойти повреждение, если прерывание произойдет, когда он уже удаляет исходный код. В этот момент у вас уже будет хорошая копия в целевом каталоге, поэтому простая проверка размера байта может помочь.
EDIT: Я провел несколько тестов с огромными файлами (несколько G), созданными с помощью dd
, но без каких-либо убедительных результатов. Никогда не удавалось скопировать только несколько источников — я либо отменял всю операцию (она была слишком быстрой), либо впоследствии вообще не получал никаких шансов из-за кэширования диска и, возможно, хорошей конструкции файловой системы (мой ^C всегда приземлялся после успешного перемещения).