rsync命令

-- TOC --

rsync 是一个常用的 Linux 应用程序,用于文件同步。它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cp和mv命令。

它名称里面的r指的是 remote,rsync 其实就是“远程同步”(remote sync)的意思。与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。

相对于scp命令,在主机之间copy文件,rsync更好用。它可以支持断点续传,就这一点就足够吸引人了。rsync从名称来看,就是为了同步文件(档案)设计的。就像那些网盘客户端的同步功能,如果有自己的云服务器,用这个命令同步,相当惬意。

更所有其他Linux命令一样,rsync的参数也是超级多,只能举例说明,一边用一边学:

$ rsync -azP --bwlimit=64 -e 'ssh -p xxxx -l name' maixj.net:~/dbs .

这条命令的作用,sync maixj.net:~/dbs整个目录到当前路径!

rsync [OTPTIONS] source destination

-a:archive模式,这一个a,相当于好多参数的合体,-rlptgoD (no -H,-A,-X);

-z:压缩传输;

-P:大写,开启断点续传,同时显示进度,即 -p --progress;

-p:断点续传;

--progress:显示进度;

-e:指示rsync用ssh登录,给出port和username;

--bwlimit:显示带宽,默认单位是KB;

-v:verbose;

-r:recursive;(一般用-a包含了-r)

-l:copy symlinks as symlinks;

-t:preserve mtime;

-n or --dry-run,如果不确定 rsync 执行后会产生什么结果,可以先用-n或--dry-run参数模拟执行的结果,看看那些文件会被同步;

--delete,默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。如果要使得目标目录成为源目录的镜像副本,则必须使用--delete参数,这将删除只存在于目标目录、不存在于源目录的文件。

--exclude=PATTERN,排除项,下面详细介绍一下这个参数:

以下是我个人测试的结果:

这个PATTERN是glob,不是re。

--exclude='cache/',排除路径中所有的cache目录;(不能写成 'cache',含义不同)

--exclude='cache',排除路径中所有cache目录,或以cache为名称的文件;

--exclude='cache*',排除cache开头的文件和目录;

--exclude='/cache',排除第1层路径中的cache(目录或文件);

--exclude='*/cache',排除第2层路径以及后面的路径中的所有cache(目录或文件)

--exclude='cache/*',排除cache目录中的所有文件,但是保留cache这个目录;

注意路径匹配的范围,从source开始:

rsync在copy文件的时候,有一个行为跟cp和scp不一样,源写成 source 和 source/ 表示的含义是不一样的;

rsync -r source d # 得到的结果是 d 中 包含 整个source目录, d/source/...

rsync -r source/ d # 得到的结果是d中包含全部source的内容,d/...... ,(cp 和 scp只有这一种情况!)

因此写成source和source/,对pattern的解释是不同的。

写成 source,pattern的匹配从source开始;

写成 source/,pattern的匹配从 /..... 开始;

要精确控制 --exclude 的内容,就要好好体会这些规则,并做好测试。

命令行中可以同时存在多个--exclude参数,即同时排除多个项目。

本文链接:https://cs.pynote.net/sf/linux/shell/202204172/

-- EOF --

-- MORE --