2021-05-12 14:32:11
Linux資料夾對比並提取的差分檔案技巧-rsync的妙用
需求
最近團隊正在開發一個版本對比工具,要求是把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
相關文章