Найкраща практика для продовження mv


13

Я використовував термінал для копіювання файлів з одного диска на інший.

sudo mv -vi /location/to/drive1/ /location/to/drive2/

Однак це раптом зупинилося, в той час, як через декілька годин, і без помилок, після створення каталогу.

Моє власне рішення, це часто поєднання хешування та порівняння, яке, як правило, займає багато часу безладу, тому що мені зараз доводиться відновлюватись з проміжної копії, не знаючи, які файли відсутні (написано як дуже довгий однолінійний файл для zsh - зауважте, що цей сценарій не працює в bash, як написано):

source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
    echo "${hash_and_file}" | read hash file;
    echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
    echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
    mv -v "${copy_from}" "${copy_to}" | tee -a log;
    rm -v "${copy_from}" | tee -a log; };
done <<<$(
    comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${source_directory}: :g" | sort;
           ) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${target_directory}: :g" | sort; ) )

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

Чи є найкраща практика, як відновитись від перерваного МВ?


Я написав подібний сценарій , який використовує cmpзамість хешування. Він має залежності, і ті ж самі питання, while readщо згадував Гілл. Це також повільно і багатослівно. Але він звільняє простір на диску раніше, ніж метод rsync, оскільки файли (пере) переміщуються з джерела під час його запуску. Це може послужити натхненням для сміливих.
joeytwiddle

3
@joeytwiddle RSync пропозиції , --delete-during receiver deletes during the transferа також ряд інших корисних альтернатив: --delete --delete-before --delete-delay --delete-after --delete-excluded. Отже, так, rsync - найкраща альтернатива,
NotAnUnixNazi

Я, мабуть, чогось пропускаю. Чому просто не повторюється одна і та ж mvкомандна робота? Можливо, із *доданим до контуру джерелом, якщо вихідним джерелом був каталог.
jpa

@isaac Ні, боюся, rsync --delete*це стане катастрофою ! Це видалить речі, з destяких наразі немає src, тому всі файли, успішно переміщені в попередній спробі, тепер будуть видалені! Ви, напевно, думали, rsync --remove-source-filesщо, я згоден, було б хорошою альтернативою. ( more1 , more2 )
joeytwiddle

@joeytwiddle Ні, rsync --deleteбуде видалено лише інші файли, які не є частиною джерела. З [man rsync] () * видаліть сторонні файли з dest dirs *. Зрозумійте, що означає стороннє : Не синхронізується. І так, rsync також забезпечує спосіб видалення вихідних файлів після їх правильної передачі.
NotAnUnixNazi

Відповіді:


46

Забудьте про спробу винайти rsync та використовуйте rsync.

sudo rsync -av /location/to/drive1/ /location/to/drive2/

Переконайтеся, що ви використовуєте кінцеву косу рису на джерелі, інакше вона буде скопійована /location/to/drive2/drive1.

Двічі перевірте, чи вдала команда, та запустіть rm -rf /location/to/drive1/.

Команда вище замінить будь-який попередній файл із drive2. Якщо ви хочете запропонувати користувачеві пропустити файли, які вже існували drive2, як, наприклад mv -i, це складніше, тому що тепер вам потрібно розрізняти файли, які вже були скопійовані, та файли, які цього не зробили. Ви можете передати --ignore-existingопцію rsync, щоб пропустити файли, які вже є в пункті призначення, незалежно від їх вмісту. Зауважте, що якщо оригінал mvбув перерваний у середині створення файлу, цей файл залишиться у напівкопійованому стані (тоді як голий rsync -aбуде належним чином закінчити його копіювання).

Якщо ви хочете відтворити точну поведінку mv -i, включаючи спонукання, це можна зробити, але це набагато складніше.

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

Для подальшої довідки я рекомендую ніколи не використовувати mvдля великих кросових рухів, саме тому, що важко контролювати, що станеться, якщо він перерветься. Використовуйте rsync для копіювання, а потім видаліть оригінал.


Які обіцянки дає rsync, що телевізор не робить?
Що

4
ну, наприклад, rsyncробить те, що ти намагаєшся робити, тоді як mvні. Також: копіювання між різними машинами; стиснення для передачі; пропуск файлів, що існують у пункті призначення, на основі рівності на основі часових позначок або хеш; настроювану обробку прав власності, дозволів, посилань та спеціальних файлів; та ін. linux.die.net/man/1/rsync
Дурний Freak

1
@SillyFreak чи слід з цього зробити висновок, що я завжди повинен використовувати rsync замість mv, не тільки, як сказав Жилл для крос-драйву, але й будь-яку операцію, оскільки межа "занадто великого" є відносно суб'єктивною, і якщо мова йде про проблему це все-таки вирішило би rsync?
Що

9
Добре, коли я переміщую файли чи каталоги всередині одного розділу, я зазвичай використовую mv(або файловий менеджер), оскільки це лише переміщення посилання на файл / каталог. Якщо мені потрібно здійснити фактичну передачу даних, я використовую, rsyncякщо одна з наступних дійсна: 1) я переміщую більше файлів, ніж можу перевірити правильність передачі з першого погляду; 2) Я передбачаю, що мені потрібно буде синхронізувати файли; 3) Я очікую, що передача може бути перервана. Моя думка, що випадок використання, який ви представляєте у запитанні, rsync- це просто правильний інструмент, mvчи cpні.
Silly Freak

7
Я б радив завжди виконувати будь-яку команду rsync з -v та —dry-run спочатку, щоб точно підтвердити, що вона буде робити.
Даррен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.