rsync同步时,删除目标目录比源目录多余文件的方法(--delete)

在平常运维工做中,咱们常常用到rsync这个同步神器。有时在同步两个目录时,会要求删除目标目录中比源目录多出的文件,这种状况下,就可用到rsync的--delete参数来实现这个需求了。服务器

实例说明:
在服务器A上同步/tmp/work目录到远程服务器B的/tmp/work目录下(A和B已经提早作好ssh无密码信任跳转关系了),同时删除B服务器/tmp/work目录下相比于A服务器/tmp/work中多余的文件
最近在处理策划资源文件的时候须要将目录A的文件所有同步到目录B的文件,而且把目录B内多余的文件所有删除掉。因此,就想到了使用rsync的--delete参数来实现功能。运维

1)A服务器ssh

[root@serverA ~]# cd /tmp/work
[root@serverA work]# ls
a b c d 11测试

2)B服务器
[root@serverB ~]# cd /tmp/work
[root@serverB work]# ls
c d 11 12 13 fg 5t.net

3)从A服务器同步到B服务器(假设B服务器ip是11.11.11.11)
[root@serverA work]# rsync -e "ssh -p22" -avpz --delete  ./ root@11.11.11.11:/tmp/work/    #注意,--delete参数要放在源目录和目标目录前,而且两个目录结构必定要一致!不能使用./*
sending incremental file list
./
deleting fg
deleting 5t
deleting 13
deleting 12
11
a
b
c
d日志

sent 248 bytes received 110 bytes 716.00 bytes/sec
total size is 0 speedup is 0.00server

4)再次查看B服务器,发现已经跟A服务器的/tmp/work目录同步了,而且删除了多余的文件
[root@serverB ~]# cd /tmp/work
[root@serverB work]# ls
a b c d 11递归

********************************************************************************ip

扩展:资源

下面根据示例说明几个用法:

$ mkdir {dirA,dirB} //建立两个测试目录

//分别在两个目录建立相应的文件

$ touch dirA/{fileA1.txt,fileA2.txt,fileA3.txt}

$ touch dirB/{fileA1.txt,fileA2.txt,fileA3.txt,fileB1.txt,fileB2.txt,fileB3.txt}

1)将dirA的全部文件同步到dirB内,并保留文件的属主,属组,文件权限等信息

$ rsync -avz dirA/ dirB/

sending incremental file list

./

fileA1.txt

fileA2.txt

fileA3.txt

sent 199 bytes received 72 bytes 542.00 bytes/sec

total size is 0 speedup is 0.00

2)将dirA的全部文件同步到dirB内,并删除dirB内多余的文件

$ rsync -avz --delete  dirA/ dirB/       #源目录和目标目录结构必定要一致!!不能是dirA/* dirB/  或者dirA/ dirB/*  或者 dirA/* dirB/*

sending incremental file list

./

deleting fileB3.txt

deleting fileB2.txt

deleting fileB1.txt

fileA1.txt

fileA2.txt

fileA3.txt

sent 203 bytes received 72 bytes 550.00 bytes/sec

total size is 0 speedup is 0.00

3)将dirA的全部文件同步到dirB,可是在dirB内除了fileB3.txt这个文件不删以外,其余的都删除。

$ rsync -avz --delete --exclude "fileB3.txt" dirA/ dirB/

sending incremental file list

./

deleting fileB2.txt

deleting fileB1.txt

fileA1.txt

fileA2.txt

fileA3.txt

sent 203 bytes received 72 bytes 550.00 bytes/sec

total size is 0 speedup is 0.00

4)将dirA目录内的fileA1.txt和fileA2.txt不一样步到dirB目录内。

$ rsync -avz --exclude="fileA1.txt" --exclude="fileA2.txt" dirA/ dirB/

sending incremental file list

fileA3.txt

sent 106 bytes received 31 bytes 274.00 bytes/sec

total size is 0 speedup is 0.00

5) 将dirA目录内的fileA1.txt和fileA2.txt不一样步到dirB目录内,而且在dirB目录内删除多余的文件。

$ rsync -avz --exclude="fileA1.txt" --exclude="fileA2.txt" --delete dirA/ dirB/

sending incremental file list

deleting fileB3.txt

deleting fileB2.txt

deleting fileB1.txt

fileA3.txt

sent 106 bytes received 31 bytes 274.00 bytes/sec

total size is 0 speedup is 0.00

6)将dirA目录内的fileA1.txt和fileA2.txt不一样步到dirB目录内,而且在dirB目录内删除多余的文件,同时,若是dirB内有fileA2.txt和fileA1.txt这两个被排除同步的文件,仍然将其删除。

$ rsync -avz --exclude="fileA1.txt" --exclude="fileA2.txt" --delete-excluded dirA/ dirB/

sending incremental file list

./

deleting fileB3.txt

deleting fileB2.txt

deleting fileB1.txt

deleting fileA2.txt

deleting fileA1.txt

fileA3.txt

sent 109 bytes received 34 bytes 286.00 bytes/sec

total size is 0 speedup is 0.00

这里能够看到只有fileA3.txt被同步到dirB目录内,同时dirB目录内的fileA1.txt和fileA2.txt两个被过滤的文件也被删除掉了。

*********************************************************************************************************

要在Linux下删除海量文件的状况,须要删除数十万个文件。这个是以前的程序写的日志,增加很快,并且没什么用。这个时候,咱们经常使用的删除命令rm -fr * 就很差用了,由于要等待的时间太长。因此必需要采起一些很是手段。咱们能够使用rsync的--delete-before参数来实现快速删除大量文件。

1)创建一个空的文件夹:
mkdir /tmp/test
2)用rsync删除目标目录:
rsync --delete-before -a -H -v --progress --stats /tmp/test/ log/
这样咱们要删除的log目录就会被清空了,删除的速度会很是快。rsync实际上用的是替换原理,处理数十万个文件也是秒删。

选项说明: --delete-before 接收者在传输以前进行删除操做 --progress 在传输时显示传输过程 --a 归档模式,表示以递归方式传输文件,并保持全部文件属性 --H 保持硬链接的文件 --v 详细输出模式 --stats 给出某些文件的传输状态

相关文章
相关标签/搜索