Повторно используйте вывод rsync --dry-run, чтобы впоследствии ускорить фактическую передачу

23

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

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

Если это даже не имеет смысла, пожалуйста, дайте мне знать.

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

Manuel
источник
Вы можете попытаться перенаправить вывод --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но ничего не знаю из сценариев оболочки / bash ...
Мануэль

Ответы:

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