Linux 工具 | rsync
rsync 是非常常用的文件同步工具
既可以同步本地数据,类似于 cp。又可以同步远程数据,类似于 scp
rsync 不会复制全部文件,而是采取增量备份,只复制有改动的文件,速度很快
rsync 算法中判断文件改动的默认规则是,文件大小或文件修改时间
同步本地文件
最基础的用法
rsync -auv /dir1/file1 /dir2/file2
上面的命令可以把 dir1 目录下的 file1 文件,同步到 dir2 目录下,且文件名为 file2
其中用到的三个参数也是最基础的参数
-
-a
表示递归传输文件,并且保持所有属性 -
-u
表示排除目标文件比源文件更新的文件,不进行覆盖 -
-v
表示打印传输过程的信息
目标文件或目录不存在时,会自动创建
运行 rsync 命令的用户需对源目录有读取权限,对目标目录有写入权限
同步多个目录或文件,则分别列出源文件或目录
rsync -auv /dir1/ /dir2/ /dir3
上面的命令把 dir1 目录和 dir2 目录下的内容都拷贝到 dir3 目录下
注意源目录后面的斜线,如果不加,则拷贝后生成 /dir3/dir1 和 /dir3/dir2 结构
要让目标目录成为源目录的镜像副本,则用 --delete
参数
rsync -auv --delete /dir1/ /dir2
通常情况下,会把源目录的所有改动文件都拷贝到目标目录,但是只在目标目录中存在的文件不会被删除
要想目标目录内容和源目录完全一致,要加上 --delete
参数,来删除不要的文件
有时拷贝时需要排除一些文件或目录,要用--exclude
参数
rsync -auv --exclude '/back/*' --delete /dir1/ /dir2
将 dir1 目录下的内容拷贝到 dir2 目录,并且排除掉 dir1 目录下的 back 目录内容
排除多个目录及文件时,可以使用多个 --exclude 参数,或者用大括号扩展,还可以引用文件
rsync -auv --exclude '/back/*' --exclude '*.log' --delete /dir1/ /dir2
或者
rsync -auv --exclude={'/back/*', '*.log'} --delete /dir1/ /dir2
或者
rsync -auv --exclude-from='ignore.txt' --delete /dir1/ /dir2
在 ignore.txt 文件中,列出所有要排除的模式,一行一个
有时可以结合 --include
参数,更方便的排除和指定要拷贝的内容
rsync -auv --exclude '*.log' --include 'nginx-*.log' --delete /dir1/ /dir2
上面的命令表示排除掉除了 nginx 以外的 log 文件
同理,也可以用 --include-from='include.txt'
引入文件的方式
有时需要定期更新文件,且每次都放在同一个目录,用 --inplace
参数
rsync -auv --inplace --delete /dir1/ /dir2
当 dir2 目录已经存在时,就地更新 dir2 目录内容
如果想模拟测试一下执行结果,则用-n
参数
rsync -anv /dir1/ /dir2
通过 -v
参数把信息打印到终端,查看模拟结果
如果同步后需要删除源目录,用 --remove-source-files
参数
rsync -auv /dir1/ /dir2 --remove-source-files
把 dir1 目录的内容拷贝到 dir2 目录后,删除 dir1 目录内容
linux 系统没有垃圾箱,删除内容需谨慎!!!!!!!!!!!!!!!!!!
同步远程文件
rsync 中的 r 是 remote,命令本身就是远程同步的意思
默认 ssh 协议,支持从本地同步到远程,或者从远程同步到本地
本地到远程 ↓
rsync -auv /dir1/ owner@host:/dir2
远程到本地 ↓
rsync -auv owner@host:/dir1/ /dir2
当 ssh 使用了非默认值时,用 -e
参数指定
rsync -auv -e 'ssh -p 1022' /dir1/ owner@host:/dir2
rsync 命令还有很多可用参数,可以用 rsync -h
查看全部参数及解释
rsync 远程同步文件时,除了 ssh 协议外,还可以用 rsync 协议,用到后再补充