【转帖】Linux文件夹对比并提取的差分文件技巧-rsync的妙用
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
【转帖】Linux文件夹对比并提取的差分文件技巧-rsync的妙用的更多相关文章
- 推荐一款好用的文件/文件夹对比工具 —— Beyond Compare
推荐一款好用的文件/文件夹对比工具 —— Beyond Compare! 有需要的人,用了都说好: 不知道这个是干嘛用的,说再多也没用.
- Linux常用命令,查看树形结构、删除目录(文件夹)、创建文件、删除文件或目录、复制文件或目录(文件夹)、移动、查看文件内容、权限操作
5.查看树结构(tree) 通常情况下系统未安装该命令,需要yum install -y tree安装 直接使⽤tree显示深度太多,⼀般会使⽤ -L选项⼿⼯设定⽬录深度 格式:tree -L n [ ...
- C# -- 使用递归列出文件夹目录及目录下的文件 神技do{}while(false)
C# -- 使用递归列出文件夹目录及目录下的文件 使用递归列出文件夹目录及目录的下文件 1.使用递归列出文件夹目录及目录下文件,并将文件目录结构在TreeView控件中显示出来. 新建一个WinFor ...
- tomcat的bin文件夹下的.bat和.sh文件
tomcat的bin文件夹中存在一份.bat文件和相对应的.sh文件,一个是为了在window系统上执行的文件,另一个是linux下的批处理文件.例如:startup.bat和startup.sh. ...
- ubuntu18.04 复制或剪切某文件夹下的前x个文件到另一个文件夹下
该代码可以将file_path_src文件夹中的前cnt个文件,剪切或复制到file_path_tar文件夹下,前提是file_path_src中的文件名可以排序.如VOC数据集提取某个类的图片和xm ...
- 怎么统计指定文件夹下含有.xml格式的文件数目
如何统计指定文件夹下含有.xml格式的文件数目?如题 ------解决思路----------------------Directory.GetFiles(@"路径", " ...
- 请问用Inno_Setup打包文件夹时怎么排除其中一个文件?
请问用Inno_Setup打包文件夹时怎么排除其中一个文件? 该文件夹下有几十个文件,多个文件夹,我要一个个加进去该累死,也容易出问题.不知道能不能实现我要的目的. http://www.jrsoft ...
- 递归法绑定文件夹到导航树&在指定文件夹下新建文件夹
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (Request.QueryString[&q ...
- 手动删除文件夹exe病毒并恢复原来文件夹
转自手动删除文件夹exe病毒并恢复原来文件夹 经常使用U盘.MP3.MP4等移动硬盘的大家,有时是不是会发现,移动硬盘里有现了exe文件,原来本来有一个文件夹的名字是 音乐 ,但后来发现 音乐 这个文 ...
随机推荐
- Flask模板渲染
目录 Flask模板渲染 Jinja2模板引擎简介 模板 Jinja2 模板变量 变量 控制结构 宏,类似Python代码中的函数 模板继承 包含(Include) 过滤器 链式调用 常见内建过滤器 ...
- 2019-08-26 linux
1.question:什么是linux? answer:Linux由林纳斯·托瓦兹开发的一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU ...
- laravel框架之状态更改
//表单@if($v['sex']==0) <td class="se" ss="{{$v['sex']}}" id="{{$v['id']}} ...
- SpringMVC拦截器执行流程
1:MyInterceptor1.MyInterceptor2这2个拦截器都放行 MyInterceptor1......preHandleMyInterceptor2......preHandle ...
- Linux下源码编译Mysql5.7
1.安装依赖包 yum -y install gcc-c++ ncurses-devel cmake make perl gcc autoconf automake zlib libxml libgc ...
- Centos6.5硬盘故障修复
以企业Centos6.5Linux为案例来修复系统,步骤如下: (1)远程备份本地其他重要数据,出现只读文件系统,需要先备份其他重要数据基于rsync|scp远程备份,其中/data为源目录,/dat ...
- CefSharp 屏蔽右键菜单
既然是C#+web混用模式,当然就需要把web的右键操作屏蔽掉咯.废话不说了直接上代码. internal class MenuHandler : IMenuHandler { public bool ...
- linux命令:set 指定行,直接替换并修改文件
sed 命令: 指定行,从第一行到第一行: 把该行的ssd,换成cd: -i 表示的是替换并直接修改文件: sed -i '1,1s/ssd/cd/g' test_file 命令使用: sed - ...
- 小人大作战v0.02原型(单机)发布
运行环境,pc,windows 链接:https://pan.baidu.com/s/1X5XR0flRAVuinnydNyRNng 提取码:cp9q 复制这段内容后打开百度网盘手机App,操作更方便 ...
- PHP将图片转base64格式函数
base64的好处是什么?今天在跟小伙伴讨论这个问题,要是全站用Php把图片转为base64行不行? 1. 提升性能: 网页上的每一个图片,都是需要消耗一个 http 请求下载而来的, 图片的下载始终 ...