У меня проблема с 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}}'
это не очень надежно, он не будет правильно обрабатывать имена файлов с пробелами.
-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
Пропустить все остальные строки (также пустые, для удобочитаемости):
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 инвертирует шаблон поиска, поэтому выводятся только несовпадающие строки. Искали это целую вечность, наконец, дошли до того, чтобы это выяснить. Надеюсь, это будет вам полезно!