Що робить mv у випадку помилок?


18

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

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

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

Відповіді:


8

Я думаю, що вступ до infoсторінки відповідає на всі ваші запитання:

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

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

EDIT: Я провів тестування з величезними файлами (кількома G), створеними за допомогою dd, але без переконливих результатів. Ніколи не вдавалося отримати лише декілька скопійованих джерел - я або скасував всю операцію (будучи занадто швидкою), або згодом не отримав жодного шансу через кешування диска і, можливо, хороший дизайн файлової системи (мій ^ C завжди висаджувався після успіху переїзду ).


1
Щодо інформаційної сторінки, чи правильно я розумію, що для кожного каталогу джерела командного рядка вона видаляється, якщо відповідна копія вдалася? Я маю на увазі, що mv src1 src2 dstтвори в цьому відношенні подібні, mv src1 dst; mv src2 dstі кожен з mv src dstних схожий cp -a src dst && rm -rf src?
maaartinus

1
Ось як я це розумію (просто ваші телевізори були б mv && mv). Оскільки cp -aрекурсивна вже є, я сумніваюся, що це стосується окремих файлів і каталогів, знайдених під час обходу дерева. Зробимо кілька тестів пізніше.
lynxlynxlynx

12

Коли mv переходить до іншої файлової системи, він спочатку копіює всі дані в нову файлову систему. Після копіювання нових даних він видаляє старі дані. Це означає, що якщо переміщення перервано з ладу, розташування джерела все одно повинно містити всі дані.

Що стосується відновлення, корумповані лише дані призначення. Замість того, щоб знову використовувати mv, просто використовуйте rsync, а потім rm вручну

rsync -av source-dir/ dest-dir/
rm -rf source-dir
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.