从 rsync 获取传输的文件列表?

从 rsync 获取传输的文件列表?

我目前正在使用rsync一个脚本将 PHP 应用程序从暂存服务器部署到生产服务器。方法如下:

rsync -rzai --progress --stats --ignore-times --checksum /tmp/app_export/ [email protected]:/var/www/html/app/

当前正在输出正在比较的每个文件(项目中的每个文件)的列表,但我希望它仅输出修改过的文件,因此我可以运行它并选择--dry-run检查每个部署是否仅更新所需的文件。

注意:到目前为止我能做的最好的就是grep fcst结果,但我正在寻找一个rsync我确定它存在的选项,但我在手册页中找不到它。

提前致谢!

答案1

如果有一个 rsync 选项可以完全按照您的要求执行操作,我在手册页中也没有找到它。:-)

话虽如此,我并不认为通过 grep 输出来rsync -i解析出你所需要的内容有什么问题。对我来说,这感觉很好,很有 Unix 风格。

您对 rsync 命令有一个挑剔的地方:是-r多余的,因为它是暗示的-a

答案2

从 2013 年发布的 rsync v3.1.0 开始,有--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=name’s  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可以通过运行以下命令查看可用的标志rsync --info=help

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

答案3

使用--out-format选项

根据手册页:

指定该--out-format选项将提及以重要方式更新的每个文件、目录等(传输的文件、重新创建的符号链接/设备或目录)。

如果您只需要实际的文件名(--out-format="%n"),那么您的试运行命令可能如下所示:

rsync -rzan --out-format="%n" --ignore-times --checksum /tmp/app_export/ [email protected]:/var/www/html/app/


当使用 调用 rsync 时-v,它在内部使用此选项,默认格式为"%n%L",它只告诉您文件的名称,如果项目是链接,则告诉您它指向的位置。

但这还包括同步过程开始和结束时的简短摘要。

要摆脱该摘要,请--out-format直接使用该选项。

顺便说一句,-i内部也使用--out-format,但格式为"%i %n%L"

答案4

实际上,您已经回答了您自己的问题,因为您的原始命令已经有了它:--progress

这是正确的选项,尽管手册页对此有点模糊:

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

这有点道理,因为你rsync用 dryrun 模式调用你的字符串,所以不会发生任何传输,但你仍然会有进展:即已经更改并将被传输的文件。

这样,您就会得到所有文件的简洁列表,例如:

目标已拥有在源中更新的changedfile和保持不变的oldfile的副本。源还有一个附加文件: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 命令,但删除 itemization-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 将传输的文件的列表:changedfile 和 newfile。

相关内容