zoukankan      html  css  js  c++  java
  • rsync同步时,删除目标目录比源目录多余文件的方法(--delete)

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

     

    脚本如下:
     
    过滤catalina.out和logs文件
     
    以服务端为主,客户端和服务端不一致,以服务端为准
     

    #!/bin/bash

    #同步recoding的服务和启动脚本
    /usr/bin/rsync -avzur --exclude="catalina.out" --exclude="logs" --delete --progress prod-service01:/data/springboot/recording/ /data/springboot/recording/

    #同步task的服务和启动脚本
    /usr/bin/rsync -avzur --exclude="catalina.out" --exclude="logs" --delete --progress prod-service01:/data/springboot/task/ /data/springboot/task/

    #同步websocket的服务和启动脚本
    /usr/bin/rsync -avzur --exclude="catalina.out" --exclude="logs" --delete --progress prod-service01:/data/springboot/websocket/ /data/springboot/websocket/

     
     
     
     

    在日常运维工作中,我们经常用到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服务器

    [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

    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.00

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

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

    扩展:

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

    $ 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 给出某些文件的传输状态

  • 相关阅读:
    JAVA基础
    常用的快捷键
    [19]Docker01 docker学习环境 虚拟机 Centos 安装
    [18] Python控制台版-体温管理项目
    [17] MySQL数据库--学生管理系统数据库手写SQL实现
    [16] Python控制台版-学生管理系统
    [15]Python内置对象汇总
    [2] 使用PicGo + 码云搭建属于自己的图床
    [1] Django 分页
    [gitgnore]
  • 原文地址:https://www.cnblogs.com/qiangyuzhou/p/11053179.html
Copyright © 2011-2022 走看看