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

18

Я только что попытался переместить большое дерево с одного диска на другой, которое было слишком маленьким. Теперь у меня осталось кое-что, чего я не могу понять - похоже, что некоторые файлы действительно были удалены из дерева исходных текстов, в то время как другие были просто скопированы. Скорее всего, это не так, и я просто что-то пропускаю, как когда я проверял свободное место на целевом диске. : D

Команда была просто mv source-dir destination-dir, где оба каталога находятся на разных дисках. Я использую mv (GNU coreutils) 7.4. Нигде в справочной странице я не нашел ответов на следующие вопросы:

  • могут быть созданы усеченные файлы?
  • в случае ошибок что-нибудь в исходном дереве будет удалено?
  • как восстановить (простым и быстрым способом)?
maaartinus
источник

Ответы:

8

Я думаю, что введение на infoстраницу отвечает на все ваши вопросы:

Сначала он использует тот же код, который используется `cp -a 'для копирования запрошенных каталогов и файлов, затем (при условии успешного копирования) удаляет оригиналы. Если копирование не удалось, то часть, которая была скопирована в целевой раздел, удаляется. Если вы скопируете три каталога из одного раздела в другой, и копия первого каталога будет выполнена успешно, а второй - нет, первый будет оставлен в целевом разделе, а второй и третий - в исходном разделе.

Восстановление не должно быть проблемой, так как данные сохраняются. Я не знаю, насколько он пытается быть атомарным ( mkdirнапример, требуется проверка источника) или находится ли он вообще в своем домене (по сравнению с ядром), но может произойти повреждение, если прерывание происходит, когда оно уже удаляет источник. На этом этапе у вас уже будет хорошая копия в целевом каталоге, поэтому простая проверка размера байта может помочь.

РЕДАКТИРОВАТЬ: Я провел некоторое тестирование с огромными файлами (несколько G), созданными с dd, но без окончательных результатов. Никогда не получалось скопировать только несколько исходных текстов - я либо отменил всю операцию (слишком быстро), либо впоследствии вообще не получил никаких шансов из-за кэширования на диске и, возможно, хорошего дизайна файловой системы (мой ^ C всегда приземлялся после успешного перемещения ).

lynxlynxlynx
источник
1
Что касается информационной страницы, правильно ли я понимаю, что для каждого исходного каталога командной строки он удаляется, если соответствующая копия выполнена успешно? Я имею в виду, что mv src1 src2 dstработы в этом отношении похожи, mv src1 dst; mv src2 dstи каждый mv src dstпохож cp -a src dst && rm -rf src?
Маартин
1
Вот как я это понимаю (только ваши mvs будут mv && mv). Поскольку cp -aон уже рекурсивный, я сомневаюсь, что он применяется к отдельным файлам и каталогам, найденным при обходе дерева. Сделаю несколько тестов позже.
lynxlynxlynx
12

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

Что касается восстановления, только данные назначения должны быть повреждены. Вместо того, чтобы снова использовать mv, просто используйте rsync, а затем вручную rm

rsync -av source-dir/ dest-dir/
rm -rf source-dir
jordanm
источник