Получить список переданных файлов из rsync?

14

В настоящее время я использую rsyncсценарий, который развертывает приложение PHP с промежуточного уровня на рабочий сервер. Вот как:

rsync -rzai --progress --stats --ignore-times --checksum /tmp/app_export/ root@app.com:/var/www/html/app/

В настоящее время выводится список каждого сравниваемого файла (каждого файла в проекте), но я бы хотел, чтобы он выводил только измененные, поэтому я могу запустить его с --dry-runвозможностью проверки того, что каждое развертывание обновляет только желаемые файлы.

ПРИМЕЧАНИЕ. Лучшее, что я мог сделать на данный момент, - grep fcstэто результаты, но я ищу rsyncвариант, который, я уверен, что он есть, но я не могу найти его на страницах руководства.

Заранее спасибо!

Mauro
источник

Ответы:

6

Если есть опция rsync, чтобы сделать именно то, что вы просите, я также не нашел ее на странице руководства. :-)

Тем не менее, я не вижу проблемы с выводом, rsync -iчтобы разобрать именно то, что вам нужно. Это приятно и Unixy для меня.

Одно неуместное замечание с вашей командой rsync: -rизбыточно, как это и подразумевается -a.

Кевин ДеГрааф
источник
2
Спасибо чувак. Интересно, почему (из-за множества опций этой программы) такой возможности нет. Кажется довольно простой для меня.
Мауро
Привет, Кевин, на самом деле есть вариант: -Pпрогресс делает именно это в -nнастройке Dryrun, хотя -iтоже не ошибается. Смотрите мой ответ ниже.
Роберт Ридл
6

Используйте --out-formatопцию

Согласно справочной странице:

При указании этой --out-formatопции будет упоминаться каждый файл, каталог и т. Д., Которые будут обновляться значительным образом (переданный файл, воссозданная символическая ссылка / устройство или каталог).

Если вам нужны только фактические имена файлов ( --out-format="%n"), ваша команда пробного запуска может выглядеть так:

rsync -rzan --out-format="%n" --ignore-times --checksum /tmp/app_export/ root@app.com:/var/www/html/app/


Когда rsync вызывается с помощью -v, он внутренне использует эту опцию с форматом по умолчанию "%n%L", который сообщает только имя файла и, если item является ссылкой, на которую он указывает.

Но это также включает в себя краткое резюме в начале и в конце процесса синхронизации.

Чтобы избавиться от этого резюме, используйте --out-formatопцию напрямую.

Btw. -iтакже для внутреннего использования --out-format, но с форматом "%i %n%L".

грипп
источник
3

Начиная с версии rsync v3.1.0, выпущенной в 2013 году, существует --infoфлаг, позволяющий детально контролировать вывод.

 --info=FLAGS
          This option lets you have fine-grained control over the information output you want to see.  An individual flag name may be followed
          by a level number, with 0 meaning to silence that output, 1 being the default output level, and higher numbers increasing the output
          of that flag (for those that support higher levels).  Use --info=help to see all the available flag names,  what  they  output,  and
          what flag names are added for each increase in the verbose level.  Some examples:

              rsync -a --info=progress2 src/ dest/
              rsync -avv --info=stats2,misc1,flist0 src/ dest/

          Note  that  --info=names  output  is  affected  by the --out-format and --itemize-changes (-i) options.  See those options for more
          information on what is output and when.

          This option was added to 3.1.0, so an older rsync on the server side might reject your attempts at fine-grained control (if  one  or
          more  flags  needed  to  be  send to the server and the server was too old to understand them).  See also the "max verbosity" caveat
          above when dealing with a daemon.

Доступные --infoфлаги:

Use OPT or OPT1 for level 1 output, OPT2 for level 2, etc.; OPT0 silences.

BACKUP     Mention files backed up
COPY       Mention files copied locally on the receiving side
DEL        Mention deletions on the receiving side
FLIST      Mention file-list receiving/sending (levels 1-2)
MISC       Mention miscellaneous information (levels 1-2)
MOUNT      Mention mounts that were found or skipped
NAME       Mention 1) updated file/dir names, 2) unchanged names
PROGRESS   Mention 1) per-file progress or 2) total transfer progress
REMOVE     Mention files removed on the sending side
SKIP       Mention files that are skipped due to options used
STATS      Mention statistics at end of run (levels 1-3)
SYMSAFE    Mention symlinks that are unsafe

ALL        Set all --info options (e.g. all4)
NONE       Silence all --info options (same as all0)
HELP       Output this help message

Options added for each increase in verbose level:
1) COPY,DEL,FLIST,MISC,NAME,STATS,SYMSAFE
2) BACKUP,MISC2,MOUNT,NAME2,REMOVE,SKIP
Корнелиу
источник
1
Это потрясающе, спасибо. Я понятия не имел, что этот флаг существует, потому что я использую Mac - даже самая последняя версия MacOS устанавливает версию rsync от 2004 года. Ура Apple ...
twistedpixel
0

Не уверен, если это отличается между используемыми версиями / опциями, но в версии MySQL, когда я использую -iопцию, я получаю список вроде:

>f..T...... existing-file.png
>f+++++++++ new-file.png
cd+++++++++ new-dir/
>f+++++++++ new-dir/new-file.png

Итак, простое решение, чтобы получить только список фактически переданных файлов, просто запустите:

rsync [your options here] | grep -v "f..T......"

Это просто скроет все строки, содержащие f..T....... Так что эффективно это скроет идентичные файлы.

Nux
источник
0

На самом деле, вы как бы ответили на свой вопрос, поскольку у вашей первоначальной команды он уже есть --progress

Это правильный вариант, хотя справочная страница немного загадочна:

     --progress              show progress during transfer
 -P                          same as --partial --progress

Это имеет смысл, так как вы вызываете свою rsyncстроку в режиме dryrun, трансер не происходит, но у вас все равно будет прогресс: а именно файлы, которые изменились и будут переданы.

Таким образом, вы получите аккуратный маленький список всех файлов, например:

У места назначения уже есть копия измененного файла, который был обновлен в исходном файле, и старый файл, который остается неизменным. Источник также имеет дополнительный файл: newfile.

#~$ ls -lhan /tmp/destination/
total 20K
drwxrwxr-x  2 1000 1000 4,0K Jän 31 09:07 .
drwxrwxrwt 18    0    0  12K Jän 31 09:15 ..
-rw-rw-r--  1 1000 1000    2 Jän 31 09:08 changedfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 oldfile



#~$ ls -lhan /tmp/source/
total 20K
drwxrwxr-x  2 1000 1000 4,0K Jän 31 09:07 .
drwxrwxrwt 18    0    0  12K Jän 31 09:15 ..
-rw-rw-r--  1 1000 1000    2 Jän 31 09:15 changedfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 newfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 oldfile

Если затем мы вызовем вашу команду rsync, но удалим элементизацию -iи просто добавим dryrun-n

#~$ ~$ rsync -n -rza --progress --stats --ignore-times --checksum /tmp/source/ /tmp/destination/
sending incremental file list
changedfile
newfile

Number of files: 4 (reg: 3, dir: 1)
Number of created files: 1 (reg: 1)
Number of deleted files: 0
Number of regular files transferred: 2
Total file size: 2 bytes
Total transferred file size: 2 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 187
Total bytes received: 22

sent 187 bytes  received 22 bytes  418.00 bytes/sec
total size is 2  speedup is 0.01 (DRY RUN)

Вы получите список только тех файлов, которые rsync передал бы: changefile и newfile.

Роберт Ридл
источник