从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可以确定的选项,但是我在手册页中找不到它。

提前致谢!

Answers:


6

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

就是说,我看不到grepping输出rsync -i以准确解析出您所需的问题。对我来说,这感觉很好,而且是Unixy。

用rsync命令进行一次挑剔的怪癖:表示-r为,是多余的-a


2
谢啦。我不知道为什么(程序有多种选择)没有选择。对我来说似乎很基本。
毛罗(Mauro)2012年

嗨,凯文(Kevin),实际上有一个选择:-P-ndryrun设置中,进度确实可以做到这一点,尽管-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调用rsync时-v,它在内部使用默认格式为的此选项,该选项"%n%L"仅告诉您文件名,如果item是链接,则指向该文件的位置。

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

要删除该摘要,请--out-format直接使用该选项。

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


3

从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=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也会安装2004年大声笑的rsync版本。欢呼苹果...
-twistedpixel

0

不知道这在使用的版本/选项之间是否有所不同,但是在使用-i选项的mys版本中,我得到类似以下的列表:

>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......。因此,这将有效地隐藏相同的文件。


0

实际上,您已经回答了自己的问题,因为您的原始命令已经有了它: --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命令,但删除逐项记录-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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.