我目前正在使用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。