由于购买了Gen10服务器,因此有了备份的需求。经过考察,暂时选用冷备份的方式。也就是定期将数据拷贝到一个移动硬盘上。为了做到自动,准备使用rsync程序。这个程序的功能很强大,在官网上也有详细介绍。这里仅给出我使用的方式。

基本命令

Local: rsync [OPTION...] SRC... [DEST] 选项可以参照上面的官网文档。

本地备份

rsync可以进行本地或网络备份。其区别仅仅在于备份命令中的source,dest的地址是否包含:
这里根据需求,使用本地备份就可以了。

文件夹排除

rsync提供include\exclude参数以便我们能够指定需要同步的文件或文件夹。使用方式是在选项中通过--include=PATTERN, --exclude=PATTERN的方式指定排除或选中满足PATTERN的文件及文件夹。
如果需要操作的文件较多,还可以在文件中指定,然后通过--include-from=filename--exclude-from=filename 指定该文件即可。下面我就是用这种方式来指定。
需求是:我有几个文件夹,只想同步我指定的文件。假定我们有一个test文件夹,结构是这样的:

├── inner
│   ├── ininner
│   │   ├── inner3
│   │   │   └── test6
│   │   └── test5
│   └── test4
├── test1
├── test2
└── test3

为了同步指定的文件,我们需要先将所有文件排除,否则默认是同步所有文件的。可以这样写:
rsync -axv --delete --exclude=* /home/simppy/test/ /media/back/test/ 上面的语句,我们就将test文件夹备份到了/media/back/test/ 文件夹下了。但是其实什么也没备份,因为排除了所有文件。那么下面,我们就可以指定文件了。由于文件较多,我们将其写在文件中:test_include

上面命令中的 axv 是常用搭配,a可以复制文件的创建日期等属性,而且可以递归地扫描文件夹,v为显示结果。--delete 是指将目标文件夹dest中有,而source中没有的文件删除掉。

在写test_include 之前,我们先简单看一下PATTERN的写法。

PATTERN

PATTERN用于指定我们在include\exclude操作时,如果指定文件,其功能类似于正则表达式。PATTERN用于匹配路径名(包含文件名),如果匹配上,rsync就会对其进行同步。有几种类型的PATTERN:

  • 字符,这个最简单,就是匹配字符。例如test1 就匹配所有包含test1 的文件名。
  • / ,这个字符可以在行首,用于匹配source的根目录,如果放在行尾,则表示这是一个文件夹。例如/inner 就匹配inner文件,/inner/ 就匹配inner文件夹。
  • * 匹配路径中的任意部分,但是不匹配/
  • ** 匹配路径中的任意部分,包括/
  • ? 匹配任意字符,但是不匹配/
  • [] 用于给定范围,例如[a-z]
  • 如果一个PATTERN包含/ 或者**,那么会在全路径上进行匹配,包括任何前面的路径。如果不含/ 或者**,那么只会匹配路径的最后一部分,也就是文件名。例如:dir_name/** 会匹配dir_name/ 以及内部的所有内容。

test_include

在rsync对文件名进行匹配的时候,由于我们先通过exclude 参数将所有文件都屏蔽了,那么如果我们将test_include ,写成下面的样子:

test1
test2
/inner/test4
/inner/ininner/**

我们最终同步完之后,只有test1,test2。
这是因为,屏蔽所有文件之后,rsync不会对文件夹进行展开,直接截断了。因此我们要在include文件中增加*/ 来包含所有文件夹。变成这样:

*/
test1
test2
/inner/test4
/inner/ininner/**

shell脚本

下面我们通过脚本来对多个文件进行处理

#!/bin/bash
LIST="照片 电影 纪录片"
for d in $LIST;do
  rsync -axv --delete --include-from=/home/cqzhao/mybin/backup_project/${d}_include  --exclude=* /media/sata1/$d/ /media/back
done

定时crontab

通过crontab 可以定期执行上述命令。使用crontab -e 命令打开,然后键入下面的命令:
0 10 * * 3 /home/simmpy/backup.sh >> /home/simppy/backup.log 2>&1 & 这个命令可以在每周三的上午10点执行。