Linux文件夹对比并提取的差分文件技巧-rsync的妙用

[日期:2016-02-13] 来源:oschina.net  作者:mengshuai [字体:  ]
https://www.linuxidc.com/Linux/2016-02/128307.htm

早上刚百度到的 一会儿 到公司 试试
 

需求

最近团队正在开发一个版本对比工具,要求是把A1文件夹与A2对比,将A2中的增量部分,输出到update文件夹中,生成增量升级包/差分包。

方案研究

实现该功能的第一反应是,分别遍历2个文件夹,进行单个文件对比是否存在于MD5比对,并输出结果,但是这个绝对是最低级做法,并且时间复杂度为O(n²),基本上就是直接否定。

后来深入研究了内核补丁常用的diff + patch方案,即

diff -urNa dir1 dir2

生成了差异文件后,用patch命令进行文件的复制或者文件内容修改。这个很明显如果要实现需求还是要去人工代码解析diff的结果才行。也是复杂了。

突然。。或者是说类似动画片里面柯南那句masaka 搭配场景闪现的效果出现了...

能分析出文件夹差异,还能支持多种对比模式checksum、mod-time、size的,还能过滤掉svn不需要提交的二进制文件、中间文件,经常用于服务器端增量同步的,不就是rsync么。。。(该处rsync应该字号放大十倍,但是markdown改不了)

现在唯一要解决的问题是,rsync是从A文件夹同步到B文件夹,是否可以重定向这个同步的文件到C文件夹而不改变B文件夹内容呢?

翻看了rsync man之后oh ~ 这个--dry-run参数是演示trial的意思。。也就是说使用了dry-run就只能看,不会变了。。。
马上开始coding。。。

STEP1

A1.1是新文件夹,A1.0是旧文件夹,out是放置 A1.0到A1.1的保持目录结构的增量文件。

rsync --dry-run -rcnC --out-format="%n"  A1.1/  A1.0/

注意该处的-C参数是按照cvs的ignore规则来过滤不需要同步的文件,在CVS中,默认是不会提交二进制文件的,所以如果需要进行二进制文件提取,那就不要加C.
执行了该命令后,得到了一个A1目录的文件列表:
A1.1/system/app/
A1.1/system/app/A.apk
A1.1/system/app/B.apk
A1.1/system/app/C.apk
也就是差异文件,由于这里默认会显示出文件夹,所以要过滤掉以『/』结尾的文件夹的显示

rsync --dry-run -rcnC --out-format="%n"  A1.1/  A1.0/ |grep -v "/$"

这样就得到了一个纯增量文件的列表

STEP2

有了文件列表,复制的操作方法就很多了。可以继续使用rsync同步到新的out目录,以防止多次执行后错误文件修复问题
完整代码

rsync --dry-run -rcnC --out-format="%n"  A1.1/  A1.0/ |grep -v "/$"|xargs -I{} rsync -R A1/./{} out/

搞定!

总结

其实我们身边有很多常用的工具,具备强大的功能。其实作为程序猿这个群体,『浮躁』是一个界限将高手与菜鸟分开。其实高手并不是掌握了多少语言,懂了多少模式、收藏了多少的开源代码工具...
而是需要踏踏实实走好每一步。

RSync实现文件备份同步详解   http://www.linuxidc.com/Linux/2014-09/106967.htm

利用inotifywait监控主机文件和目录 http://www.linuxidc.com/Linux/2013-03/81075.htm

利用inotify+rsync实现Linux文件批量更新 http://www.linuxidc.com/Linux/2012-01/52132.htm

inotify-tools+rsync实时同步文件安装和配置 http://www.linuxidc.com/Linux/2012-06/63624.htm

rsync同步完整配置 http://www.linuxidc.com/Linux/2013-06/85781.htm

CentOS 6.5下Rsync远程同步 http://www.linuxidc.com/Linux/2014-05/101084.htm

Rsync 的详细介绍请点这里
Rsync 的下载地址请点这里

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-02/128307.htm

【转帖】Linux文件夹对比并提取的差分文件技巧-rsync的妙用的更多相关文章

  1. 推荐一款好用的文件/文件夹对比工具 —— Beyond Compare

    推荐一款好用的文件/文件夹对比工具 —— Beyond Compare! 有需要的人,用了都说好: 不知道这个是干嘛用的,说再多也没用.

  2. Linux常用命令,查看树形结构、删除目录(文件夹)、创建文件、删除文件或目录、复制文件或目录(文件夹)、移动、查看文件内容、权限操作

    5.查看树结构(tree) 通常情况下系统未安装该命令,需要yum install -y tree安装 直接使⽤tree显示深度太多,⼀般会使⽤ -L选项⼿⼯设定⽬录深度 格式:tree -L n [ ...

  3. C# -- 使用递归列出文件夹目录及目录下的文件 神技do{}while(false)

    C# -- 使用递归列出文件夹目录及目录下的文件 使用递归列出文件夹目录及目录的下文件 1.使用递归列出文件夹目录及目录下文件,并将文件目录结构在TreeView控件中显示出来. 新建一个WinFor ...

  4. tomcat的bin文件夹下的.bat和.sh文件

    tomcat的bin文件夹中存在一份.bat文件和相对应的.sh文件,一个是为了在window系统上执行的文件,另一个是linux下的批处理文件.例如:startup.bat和startup.sh. ...

  5. ubuntu18.04 复制或剪切某文件夹下的前x个文件到另一个文件夹下

    该代码可以将file_path_src文件夹中的前cnt个文件,剪切或复制到file_path_tar文件夹下,前提是file_path_src中的文件名可以排序.如VOC数据集提取某个类的图片和xm ...

  6. 怎么统计指定文件夹下含有.xml格式的文件数目

    如何统计指定文件夹下含有.xml格式的文件数目?如题 ------解决思路----------------------Directory.GetFiles(@"路径", " ...

  7. 请问用Inno_Setup打包文件夹时怎么排除其中一个文件?

    请问用Inno_Setup打包文件夹时怎么排除其中一个文件? 该文件夹下有几十个文件,多个文件夹,我要一个个加进去该累死,也容易出问题.不知道能不能实现我要的目的. http://www.jrsoft ...

  8. 递归法绑定文件夹到导航树&在指定文件夹下新建文件夹

    protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (Request.QueryString[&q ...

  9. 手动删除文件夹exe病毒并恢复原来文件夹

    转自手动删除文件夹exe病毒并恢复原来文件夹 经常使用U盘.MP3.MP4等移动硬盘的大家,有时是不是会发现,移动硬盘里有现了exe文件,原来本来有一个文件夹的名字是 音乐 ,但后来发现 音乐 这个文 ...

随机推荐

  1. CSP复赛day2模拟题

    没错,我又爆零了.....先让我自闭一分钟.....so 当你忘记努力的时候,现实会用一记响亮的耳光告诉你东西南北在哪. 好了,现在重归正题: 全国信息学奥林匹克联赛(NOIP2014) 复赛模拟题 ...

  2. 基于vue+springboot+docker网站搭建【一】 前言

      前言 开一个系列记录下一次从0开始搭建一个网站的过程.前后端项目都是在github找的开源项目,主要用于练习部署. 前端:vue.js 后端: spring-boot 搭建环境:centOS7.6 ...

  3. SpringJDBC源码解析

    读完本篇文章需要很长很长时间.... 传统JDBC 相信大家对传统的jdbc已经很熟悉了,无非就是下面这个流程 1234567891011 //1.加载驱动程序Class.forName(" ...

  4. 学习笔记之Web

    学习笔记之JavaScript - 浩然119 - 博客园 https://www.cnblogs.com/pegasus923/p/9436340.html 学习笔记之PHP - 浩然119 - 博 ...

  5. Gin-Go学习笔记二:Gin-Web框架

    Gin-Web框架 1>     首先声明,这个是我自己搭建的纯Gin-Web框架,其中有借鉴学习别的想法和代码.已上传到GitHub上.地址为: https://github.com/weiy ...

  6. 关于C++中使用++it还是it++的问题

    我们经常使用for循环来遍历东西,循环变量可以前自增也可以后自增,发现对遍历结果没啥影响,但是该如何选择呢? 我们应该尽量使用前自增运算符而不是后自增运算符,即用 ++ Iter 代替 Iter++ ...

  7. android studio学习----添加项目依赖包总结

    Gradle Library Projects Gradle 项目可以依赖于其它组件.这些组件可以是外部二进制包,或者是其它的 Gradle 项目. 在本例中, app/build.gradle 中有 ...

  8. python3 内建函数filter

    Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是 ...

  9. zookeeper中的QuorumPeerMain解析

    https://www.cnblogs.com/7758521gorden/p/8006983.html zookeeper中的QuorumPeerMain解析   在一个初级的hadoop与zook ...

  10. Django框架(九)-- 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    一.创建多表模型 一对一:OneToOneField 一对多:ForeignKey 多对多:ManyToManyField 创建表时,会自动添加一个nid字段,并且自增,所以id可以不用手动创建 On ...