Використовуйте повторно rsync - сухий запуск, щоб потім прискорити фактичну передачу


23

Я зазвичай роблю, rsync -nперш ніж робити фактичне rsync. Вся справа в тому, як я міг автоматизувати другий запуск, щоб повторно використовувати саме той список, що генерується --dry-run?

Я маю на увазі, якщо я запускаю rsync -nтоді, я отримую симуляцію того, що rsyncб зробити, моя ідея полягала б у тому, щоб взяти цей вихід, обробити його, а потім якось зробити rsyncлише --include-fromцей вихід, тому повний список має бути обчислений лише один раз.

Якщо це навіть не має сенсу, будь ласка, дайте мені знати.

До речі, я схильний використовувати rsync -hva --progress --stats --delete --exclude-from "$EXCLUDEFILE". Якщо ви також маєте пропозицію щодо того, які варіанти ви б використали, будь ласка, повідомте мене. Я намагаюся дублювати вміст зовнішнього жорсткого диска (який містить лише зображення, відео та документи) на інший зовнішній жорсткий диск.


Ви можете спробувати перенаправити висновок з --dry-runкоманди у файл (наприклад, rsync --dry-run -avz SOURCE DEST > include.txt), видаливши з рядку include.txt всі рядки, які не є файлами / шляхами, та запустивши rsync --include-from include.txt.
ThatGuy

Ця остання команда повинна бути rsync --include-from include.txt --exclude=* SOURCE DEST. Докладні відомості див. У розділі stackoverflow.com/a/19296415/1765910 .
ThatGuy

Так, це ідея, але я не знаю, як насправді це зробити (плюс я хотів би отримати схвалення від того, хто насправді знає, що робить). Я просто використовую, rsyncале нічого не знаю зі скриптів оболонки / баш…
Мануель,

Відповіді:


19

Безумовно, можна використовувати список файлів, сформований під час сухого запуску, як файл включення. Однак в ідеалі зайві рядки у верхній і нижній частині вихідного сигналу слід видалити.

Приклад виводу:

sending incremental file list
[LIST OF FILES]

sent 226 bytes  received 34 bytes  520.00 bytes/sec
total size is 648,373,274  speedup is 2,493,743.36 (DRY RUN)

Щоб видалити ці лінії, підключіть rsyncвисновок до headі в tail. Потім збережіть оброблений вихід у файл включення:

rsync --dry-run -avz source/ destination/ | head --lines=-3 | tail --lines=+3 > include.txt

Нарешті, скажіть rsyncвикористовувати створений файл включення (додаючи додаткові опції за бажанням):

rsync --include-from=include.txt --exclude=* source/ dest/


Проблема в цьому полягає в тому, що він не справляється з файлами, які слід видалити. І чи достатньо цього методу tail/ headнадійного, щоб мати лише список файлів?
Мануель

Додавання --deleteпризводить до того, що файли, видалені з вихідних каталогів, також видаляються з каталогів призначення, принаймні на комп'ютері, на якому я його спробував. Ви можете залишити tail/ headчастину повністю. rsyncінтерпретує кожен рядок у файлі включення як ім'я файлу і просто ігнорує неіснуючі файли, тому нічого не відбудеться, якщо ви збережете зайві рядки (якщо у вас не буде файлів з назвою "надсилання інкрементального списку файлів" тощо). ці файли також будуть скопійовані).
ThatGuy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.