Что делает mv в случае ошибок?

Что делает mv в случае ошибок?

Я только что попытался переместить большое дерево с одного диска на другой, который оказался слишком маленьким. Теперь у меня осталось что-то, чего я не могу понять - похоже, что некоторые файлы действительно были перемещены из исходного дерева, а другие просто скопированы. Скорее всего, это неправда, и я просто что-то упускаю из виду, как я это сделал, когда проверял свободное место на целевом диске. :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 всегда приземлялся после успешного перемещения).

Связанный контент