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服务器

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转载]如何做到 jQuery-free?

http://www.ruanyifeng.com/blog/2013/05/jquery-free.html jQuery是现在最流行的JavaScript工具库。 据统计,目前全世界57.3%的网站使用它。也就是说,10个网站里面,有6个使用jQuery。如果只考察使用工具库的网站,这个比例就会上升…

请教大家:如何把.DCU文件反编译回源代码?谢谢。

请教大家:如何把.DCU文件反编译回源代码?谢谢。 Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061116174815216.html如题。扣谢。 一定结贴。 我也想知道有没办法~~顶一顶~~ .DCU没有办法反编译成源代码的。 是不可能的…

CSS之flex需要知道的一切(一)

1.flex速记 1.1 flex: 0 1 auto 很容易理解这一点,flex-basis设置为auto,这意味着Flex项目的初始宽度计算是基于内容的大小来自动变化 flex-grow设置为0,这意味着flex-grow不会改变Flex项目的初始宽度,也就是flex-grow的开关是…

[文摘20090203]手机基本知识

本文转自:http://www.paipaitxt.com/r4625042/ 原文如下: ~手机类型~ 按操作系统划分,可分为:智能手机与非智能手机 一般具有:Symbian6.0,Windows CE,Palm,Linux开放性操作系统的手机…

win7 安装 IIS

和xp不同,xp安装 IIS需要下载额外的软件包. 步骤 1,依次打开 "控制面板" -> "程序" ->"打开或关闭windows功能": 2,安装图示选择: 确定即可.转载于:https://www.cnblogs.com/listened/p/4014762.html

如何处理Oracle客户端查询乱码问题

From: http://archive.cnblogs.com/a/2074122/ 1,查Oracle数据库创建时候的字符集:Oracle服务器端执行SQL> select name, value$ from sys.props$ where name like NLS%;NAME VALUE$------------------------------ -------------------------------…

git 下载项目到本地

1、新建一个目录,存放下载下来的项目,我在D盘新建了一个“gitspace”文件夹,用来存放下载下来的项目 2、进入刚刚新建的文件夹,即进入“gitspace”,点击鼠标右键,选择"Git Bash Here",如下图&am…

CSS之flex需要知道的一切(二)

4. flex实战项目音乐播放器 1.你可以让整个包含体作为Flex容器(下图中被包含在红色边框内的部分),并把布局的其它部分分成Flex项目(Item 1 和 Item 2) 注:你知道Flex项目也可以成为Flex容器吗?…

iOS获取电量方法

ios简单的方法: [UIDevice currentDevice].batteryMonitoringEnabled YES;double deviceLevel [UIDevice currentDevice].batteryLevel;获取当前剩余电量, 我们通常采用上述方法。这也是苹果官方文档提供的。 它返回的是0.00-1.00之间的浮点值。 另外, -1.00表示模…

11种控制内容展示的JavaScript特效和技巧

交付信息结构是一个交互式用户界面所需要完成的首要任务。更直观的布局结构设计,能使用户更好的理解内容。 不管你想要介绍的是什么样的内容,你都可以以更加互动和更加适应的方式去呈现现它。本文里面,我们为你收集整理了11种高超的JavaScipt…

MAC上安装brew

MAC上安装brew brew 是 Mac 下的一个包管理工具,作用类似于 centos 下的 yum。 brew 可以用一条命令,就可以在mac上安装、卸载、更新各种软件包,因为brew的使用方便,如今已成为使用mac电脑的程序员的必备工具 mac上如何安装bre…

CSS之Multi-columns的列数和列宽

“Multi-column”译成中文就是“多列”,这个”Multi-column”是W3C给CSS3增加的一个多列布局模块(CSS Multi-column Layout Module)。它主要应用在文本的多列布局方面,对于文本的多列布局我想大家并不陌生,因为报纸和杂…

[Linux] 修改系统默认编码

locale 命令 locale 命令用以设置程序运行的语言环境。 locale 设置语言环境的命名规则为 Language_area.charset,例如 en_US.utf8 表示语言为英语,地区为美国,字符集为 UTF-8。 查看当前字符映射文件 $ locale charmapUTF-8 查看可用公共语言…

Taro+react开发(44)taro基本使用

Taro.Component Taro.Component 是一个抽象基础类,因此直接引用 Taro.Component 几乎没意义。相反,你通常会继承自它,并至少定义一个 render() 方法。通常你定义一个 Taro 组件相当于一个纯 JavaScript 类:class Welcome extends …

人生的34个好习惯

1.不说“不可能”三个字2.凡事第一反应::找方法,而不是找借口3.遇到挫折大声对自己说:“太棒了”4,不说消极的话,不落入消极情绪,一旦出现立即正面处理5.凡事先订立目标,并且尽量制作…

homebrew长时间停在Updating Homebrew 这个步骤

在国内的网络环境下使用 Homebrew 安装软件的过程中可能会长时间卡在 Updating Homebrew 这个步骤。 例:执行 brew install composer 命令 ➜ ~ brew install composer Updating Homebrew... # 如果碰到长时间卡在这里,参考以下 2 种处理方法 方法 1&…

bash命令行中带通配符参数何时展开??

在bash中执行的命令&#xff0c;有些参数经常会带个通配符的&#xff0c;但是你知道这个参数是何时展开的吗&#xff1f; 先来看下简单的bash小代码&#xff1a; [zcmdebug #88]$cat del.sh #!/bin/bashif [ $# -lt 2 ]; thenecho "Usage: $0 <separator> <fil…

CSS之Multi-columns的column-gap和column-rule

column-gap就相当于两列之间的空白处&#xff0c;而column-rule就相当于一条分隔线&#xff0c;换句话说呢&#xff1f;column-gap就像我们web页面中的margin一样&#xff0c;而column-rule就类似于border&#xff0c;不过他们只是存在相邻两列之间 另外column-gap和column-ru…

Redis多机功能介绍

Redis多机功能目的&#xff1a;以单台Redis服务器过渡到多台Redis服务器 Redis单机在生产环境中存在的问题 1、内存容量不足 Redis使用内存来存书数据库中的数据&#xff0c;但是对于一台机器来说&#xff0c;硬件的内存容量是有限的&#xff0c;当我们需要存储的数据量超过机器…