rsync-Linux工具小记
rsync 是一个常用的 Linux 应用程序,用于文件同步。rsync 是”远程同步”(remote sync)的意思。与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。
它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cp
和mv
命令。
本笔记记录一些入门参数和用法。
安装
Ubuntu下,一般来说,不是最简安装的系统应该都已经自带。
1 | sudo apt-get update |
参数用法
1 | -a 这是归档模式,表示以递归方式传输文件,并保持所有属性,它等同于-r、-l、-p、-t、-g、-o、-D 选项。-a 选项后面可以跟一个 --no-OPTION,表示关闭 -r、-l、-p、-t、-g、-o、-D 中的某一个,比如-a --no-l 等同于 -r、-p、-t、-g、-o、-D 选项。 |
用法示例
-r
-r
表示递归(recursion),即包含子目录。
1 | rsync -r source destination |
-a
这是归档模式,表示以递归方式传输文件,并保持所有属性,它等同于-r、-l、-p、-t、-g、-o、-D 选项。-a 选项后面可以跟一个 –no-OPTION,表示关闭 -r、-l、-p、-t、-g、-o、-D 中的某一个,比如-a –no-l 等同于 -r、-p、-t、-g、-o、-D 选项。
比-r常用,一般直接用-a
1 | rsync -a source destination |
如在 source
后加 /
,即 source/
则表示只同步源目录的内容到目标目录,不是整个文件夹都同步。如果不加,则会在 destination
下添加整个 source
目录,结构则为 destination/source
-n
-n
参数模拟命令执行的结果,并不真的执行命令。可以加上 -v
查看输出结果。
1 | rsync -anv source destination |
–delete
默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。如果要使得目标目录成为源目录的镜像副本,则必须使用--delete
参数,这将删除只存在于目标目录、不存在于源目录的文件。
1 | rsync -a --delete source destination |
上面命令中,--delete
参数会使得destination
成为source
的一个镜像。
–exclude
有时,我们希望同步时排除某些文件或目录,这时可以用--exclude
参数指定排除模式。
如:不同步所有隐藏文件。
1 | rsync -a --exclude '.*' source destination |
可以多次使用满足不同的排除需求;或bash大括号扩展;或逐行写入文件里,指定到该文件。
1 | rsync -a --exclude '.*' --exclude '*.txt' source destination |
–include
--include
参数用来指定必须同步的文件模式,往往与--exclude
结合使用。
1 | rsync -a --include="*.txt" --exclude='*' source/ destination |
上面命令指定同步时,排除所有文件,但是会包括 TXT 文件。
同步模式
rsync支持本地同步(如上参数示例),也支持远程同步。
1 | rsync -av source username@remote_host:destination |
可使用 -e
指定ssh协议命令
基准同步
除上,还可以设置基准目录以同步。
rsync 还支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录。
具体做法是,第一次同步是全量备份,所有文件在基准目录里面同步一份。以后每一次同步都是增量备份,只同步源目录与基准目录之间有变动的部分,将这部分保存在一个新的目标目录。这个新的目标目录之中,也是包含所有文件,但实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接。
--link-dest
参数用来指定同步时的基准目录。
1 | rsync -a --delete --link-dest /compare/path /source/path /target/path |
上面命令中,--link-dest
参数指定基准目录/compare/path
,然后源目录/source/path
跟基准目录进行比较,找出变动的文件,将它们拷贝到目标目录/target/path
。那些没变动的文件则会生成硬链接。这个命令的第一次备份时是全量备份,后面就都是增量备份了。
参考
rsync-Linux工具小记