Blog·Tanky WooABOUTRSS

Rsync -i/--itemize-changes Option

06 Feb 2014

又一个在TODO里放了很久的任务,一直准备把rsync-i/--itemize-changes 选项小结下, 看日期是2013/12/12号建的,拖到了今天,惭愧!

我习惯的rsync短参数组合选项是-hvaiHEXA-a等价于-rlptgoD。不过rsync不同的版本支持的参数不一样,比如像-X-A在2.6.9下测试就不支持。

-i/--itemize-changes 选项很强大,我认为可以说是必选的选项。因为这个选项可以看到哪些文件被同步了,已经修改了哪些内容/属性。我使用rsync命令的次数也很多了,包括有时多台虚拟机之间同步同一个系统等,就遇到过一些问题,印象中当时是/etc/sudoers文件被设置了-i权限(chattr, mac下用chflags命令),导致当时复制过来的模板系统有问题,后来检查后就是通过这里以及相关的输出信息看出来了。


声明

rsync 的版本不同,很多都有变化,这里参考的的是 2.6.9 下的man手册和程序。

比如在gentoo下我使用的是 rsync 3.0.9, 则输出的信息长度是11位。所以一定要根据当前的版本和文档来确定。

-i/--itemize-changes的效果等价于--out-format='%i %n%L'。默认不会输出未更新的文件,使用两个-i 可以输出未更新文件。

: 在2.6.9版本下有问题,虽然文档说不会输出,但实际输出了未更新文件,而在3.0.9下测试则是按照文档描述显示的。

它控制的输出信息是9个字符的长度,格式是YXcstpogz

其中Y和X都是替换符, 每个都有几个可选的字符使用。

Y 控制更新的类型:

c 这个我也不是很明白, 原文是:

A c means that a local change/creation is occurring for the item(such as the creation of a directory or the changing of a symlink, etc.).

首先不明白这里用到的 item 和上面的>/< 里的 file 有什么区别;所以这里的修改新建等不知和文件的修改新建有何区别,因为文件的修改新建等都是><

个人猜测这里的 item 应该指除了 file 以外的, 比如 directory, soft/hard link等。

另外一个就是 .,这里也有点疑问, 想不出有哪些属性会被修改? TODO

X 控制文件类型:

后面7位都表示实际的字符, 如果相应的属性被更新, 则输出响应位置的字符, 否则输出.表示未更新。有三个例外的情况:

下面说明剩下7个字符的含义(括号表示需要使用的选项, 除了c, 其余的都已经被-a选项包含了):

举例:

# 两个目录 a 和 b
# 其中 a/f1 和 b/f1 内容不一样
# a/f2 内容和属性和 b/f2 一样
# f5 是指向f1的硬链接
# c 是一个目录
TankyWoo@Mac-OS::/tmp/ » tree a
a
├── c                    # 目录
├── f1
├── f2
├── f3
├── f4 -> /tmp/a/f1
└── f5

1 directory, 4 files
TankyWoo@Mac-OS::/tmp/ » tree b
b
├── f1
├── f2
└── f4 -> /tmp/b/f2

0 directories, 3 files

TankyWoo@Mac-OS::/tmp/ » rsync -hvaiHE --checksum  a/ b/ -n
building file list ... done
.d..t.... ./
>fcst.... f1
.f        f2                   # 什么都没有更新
>f+++++++ f3                   # 新建 f3 文件
cL..T.... f4 -> /tmp/a/f1      # symlink有变化
hf+++++++ f5 => f1             # h指示为硬链接
cd+++++++ c/                   # 新建目录c

sent 287 bytes  received 65 bytes  704.00 bytes/sec
total size is 57  speedup is 0.16