Назад | Перейти на главную страницу

rsync - сообщать только о загруженных файлах

У меня проблема с rsync: либо он показывает мне все файлы в каталогах, которые я использую rsync (если используется флаг -v) или вообще ничего (если не использовать -v).

Я бы хотел, чтобы rsync был тихим Кроме для файлов, которые действительно нужно было загрузить на дальний конец. Есть ли флаг для активации такого рода отчетов? Я не могу найти это в документации

Да, посмотрите -i флаг. Он дает отчет о каждой операции в загадочном формате. См. Справочную страницу для точного определения формата.

Чтобы получить список файлов, которые отправляются на удаленный хост, вы можете использовать следующее:

rsync <options> -i <src> <dst> | grep '^<' | awk '{ print $2 }'

rsync с одним -v фактически печатает только переданные файлы. Если вы каждый раз получаете полный список, это, вероятно, означает, что алгоритм сравнения rsync src / dest по умолчанию, основанный на времени модификации + размере, не подходит для вашего случая. Вы можете добавить -c (--checksum) флаг, который заставляет rsync сравнивать файлы по контрольной сумме. Обратите внимание, что это, очевидно, влечет за собой некоторые накладные расходы ввода-вывода.

Немного связан тот факт, что если вы используете --info=flist вместо того -v тогда вы получите более обрезанный вывод файлов (вы в основном пропускаете верхний и нижний колонтитулы типичного -v вывод).

одна вещь, которая приходит мне в голову, - это использование более подробного формата журнала и awk'ing того, что вы хотите получить.

например:

rsync -a --out-format="%b  %i %f" /etc/ /tmp/qq/ |awk '{if ($1>0) {print $3}}'

это не очень надежно, он не будет правильно обрабатывать имена файлов с пробелами.

1. Используйте -i вариант

Для этих значков (или: cryptic) флагов изменений. Ваш вывод будет выглядеть так:

*deleting   DSC00012 (copy).JPG
.d..tp..... ./
.f...p..... DSC00011.JPG
>f+++++++++ DSC00012 (copy2).JPG
>f.stp..... DSC00012.JPG
.f...p..... DSC00014.JPG

Number of files: 5 (reg: 4, dir: 1)
Number of created files: 1 (reg: 1)
... more statistic stuff
sent 636.01K bytes  received 4.63K bytes  1.28M bytes/sec
total size is 2.84M  speedup is 4.44

2. Выполните grep каждую строку, начинающуюся с точки.

Пропустить все остальные строки (также пустые, для удобочитаемости):

rsync -arz -i --stats -h ... /mnt/FooDrive/ /mnt/backup  | grep -E '^[^.]|^$'

И вот мы :-) - Именно то, что доктор прописал:

*deleting   DSC00012 (copy2).JPG
>f.stp..... DSC00011.JPG
>f+++++++++ DSC00012 (copy).JPG

Number of files: 5 (reg: 4, dir: 1)
Number of created files: 1 (reg: 1)
...

Избегайте точек скорее, чем охота на > имеет то преимущество, что позволяет передавать статистику, а также потенциальные ошибки, предупреждения и т. д. ...

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

Я не думаю, что для этого есть флаг, но теперь он может быть. Вот как я это сделал:

rsync -vv [other options] | grep -v 'uptodate'
rsync -av --delete-before --force --progress /path/to/src/dir/ -e ssh user@host:/path/to/target/dir | grep -v '.*/$'

Это работает для меня ("rsync версия 3.1.3 протокол версии 31" на компьютере src и "rsync версия 3.1.2 протокол версии 31" на целевой машине, чтобы быть точным). Он просто пропускает любые строки с завершающей косой чертой, которые являются основной частью неизмененного материала, который просто прокручивается без необходимости. grep -v инвертирует шаблон поиска, поэтому выводятся только несовпадающие строки. Искали это целую вечность, наконец, дошли до того, чтобы это выяснить. Надеюсь, это будет вам полезно!