date: 2021-07-16title: Rsync工具使用详解 #标题
tags: rsync #标签
categories: linux大杂烩 # 分类

Rsync 是一种快速且通用的命令行实用程序,可通过远程shell在两个位置之间同步文件和文件夹。
使用 Rsync,可以镜像数据,创建增量备份,并在系统之间复制文件。复制数据时,你可能要根据文件名或位置排除一个或多个文件或目录。

rsync同步时排除指定目录

需求:应用更新前对原应用目录(/apps/var/dfp-api/)进行备份到/apps/var/backup/目录,但是/apps/var/dfp-api/目录下有logs子目录,用于存放日志文件,所以logs目录并不需要备份,因此在备份时要排除此目录(/apps/var/dfp-api/logs)。

  1. $ pwd
  2. /apps/var
  3. $ rsync -avz --exclude=dfp-api/logs /apps/var/dfp-api /apps/var/backup/dfp-api$(date +%F_%H%M)
  4. # --exclude= : 用于指定要排除的目录或文件
  5. # 注:--exclude指定的文件或目录是以rsync指令指定的源路径 “/apps/var/dfp-api”作为根目录的
  6. # 可能现在还不太理解,没关系,接着往下看,你会懂的

rsync同步后如下(备份的目录没有包含logs子目录):

Rsync工具使用详解 - 图1

rsync指令中 “/”号的坑

相信你们也注意到了,备份后的目录为:/apps/var/backup/dfp-order-2020/dfp-order/,备份后的目录,多了一层子目录,很明显这不是我们想要的效果,我们想的是备份后的目录为/apps/var/backup/dfp-order-2020/,这个目录下面就是/apps/var/dfp-api/目录下的东西才对,那么怎么回事呢?

这就不得不说rsync命令对路径结尾的/号有多敏感了,也是很多同学会踩到的坑,其实上面的需求所对应的正确命令是这样的:

$ rsync -avz --exclude=logs /apps/var/dfp-api/ /apps/var/backup/dfp-api$(date +%F_%H%M)

备份后目录结构如下:

Rsync工具使用详解 - 图2
相信你们已经看懂了,--exclude指定的目录或文件,它都是以rsync命令指定的源路径作为根目录的。

rsync高阶指令

常用选项:

  • —exclude:在命令行中排除指定文件或目录
  • —exclude-from:将要排除的文件或目录写入文件中,然后通过此指令指定此文件。
# 排除src_directory/file.txt 文件
$ rsync -a --exclude 'file.txt' src_directory/ dst_directory/


# 排除 src_directory/dir1 目录
$ rsync -a --exclude 'dir1' src_directory/ dst_directory/

# 排除 src_directory/dir1 目录下的所有文件,但不排除 dir1目录
$ rsync -a --exclude 'dir1/*' src_directory/ dst_directory/

# 排除多个目录及文件
$ rsync -a --exclude={'file1.txt','dir1/*','dir2'} src_directory/ dst_directory/

# 将要排除的文件或目录写入一个文件,然后指定此文件进行排除
$ rsync -a --exclude-from='exclude-file.txt' src_directory/ dst_directory/
$ cat exclude-file.txt      # 文件中写入要排除的目录及文件
file1.txt
dir1/*
dir2


# 根据正则排除多个文件或目录(排除所有 .jpg 结尾的文件)
$ rsync -a --exclude '*.jpg*' src_directory/ dst_directory/


# 只同步 .jpg 文件,其他全部不同步
$ rsync -a -m --include='*.jpg' --include='*/' --exclude='*' src_directory/ dst_directory/
# --include='*.jpg':首先,我们包括所有.jpg文件。
# --include='*/':然后,我们将所有目录都包含在in src_directory目录中。没有这个rsync只会复制*.jpg顶级目录中的文件。
# -m:删除空目录



# 上面的命令也可以结合find来实现
$ find src_directory/ -name "*.jpg" -printf %P\\0\\n | rsync -a --files-from=- src_directory/ dst_directory/
# -printf %P\\0\\n:将从src_directory/文件路径中删除。
# --files-from=:表示仅包含来自标准输入的文件(从find命令传递的文件)。

Rsync使用ssh通信时,指定ssh端口

# 其中-o StrictHostKeyChecking=no 可选
$ rsync -rvze 'ssh -p 36000 -o StrictHostKeyChecking=no' --progress /data/tce_dc/workspace/product-tcenter-support-fileagent/TCE/cc.declare.json root@10.35.13.9:/data