天天看點

利用 Linux 查找重複檔案

利用 Linux 查找重複檔案

本部分算是對find強大功能的擴充使用方法說明。在find的基礎上,我們可與(如xargs指令)等其它基本linux指令相結合,即能創造出無限的指令行功能,比如:可以快速查找出linux某個檔案夾及其子檔案夾中的重複檔案清單。要實作這個功能在流程上是比較簡單的,隻要查找周遊出所有檔案,再通過指令去比較每個檔案的md5就ok啦。

聽起來好像比較抽象,其實指令就一條:

find -not -empty -type f -printf “%sn” 表示使用find指令搜尋出所有非空檔案,再列印出他們的大小

sort -rn 指令不用多說了把,這條指令就是按檔案大小進行反向排序

uniq -d | xargs -i{} -n1 find -type f -size {}c -print0 表示隻列印了重複的行,這裡使用代表列印出檔案名相同的檔案

uniq -w32 –all-repeated=separate 最後這裡表示對md5的前32個位元組進行對比,以篩選出重複檔案 使用指令行的整個過程就是這麼簡單和容易。

dupeguru是一個跨平台應用,有linux、windows和mac os x版本,它可以通過檔案大小、md5和檔案名等多種标準來幫助使用者找出linux中的重複檔案。ubuntu使用者可以直接通過添加如下ppa源來方式來進行安裝:

在工作生活當中,我們很可能會遇到查找重複檔案的問題。比如從某遊戲提取的遊戲文本有重複的,我們希望找出所有重複的文本,讓翻譯隻翻譯其中一份,而其他的直接替換。那麼這個問題該怎麼做呢?當然方法多種多樣,而且無論那種方法應該都不會太難,但筆者第一次遇到這個問題的時候第一反應是是用linux的shell腳本,是以文本介紹這種方式。

先上代碼:

大家先cd到自己想要查找重複檔案的檔案夾,然後copy上面代碼就可以了,系統會對目前檔案夾及子檔案夾内的所有檔案進行查重。

下面分析一下上面的指令。

首先看第一句:

find是查找指令;-not -empty是要尋找非空檔案;-type f是指尋找正常檔案;-printf “%sn”比較具有迷惑性,這裡的%s并非c語言中的輸出字元串,它實際表示的是檔案的大小,機關為bytes(不懂就man,man一下find,就可以看到了),n是換行符。是以這句話的意思是輸出所有非空檔案的大小。

通過管道,上面的結果被傳到第二句:

sort是排序,-n是指按大小排序,-r是指從大到小排序(逆序reverse)。

第三句:

uniq是把重複的隻輸出一次,而-d指隻輸出重複的部分(如9出現了5次,那麼就輸出1個9,而2隻出現了1次,并非重複出現的數字,故不輸出)。

第四句:

這一部分分兩部分看,第一部分是xargs -i{} -n1,xargs指令将之前的結果轉化為參數,供後面的find調用,其中-i{}是指把參數寫成{},而-n1是指将之前的結果一個一個輸入給下一個指令(-n8就是8個8個輸入給下一句,不寫-n就是把之前的結果一股腦的給下一句)。後半部分是find -type f -size {}c -print0,find指令我們前面見過,-size{}是指找出大小為{}bytes的檔案,而-print0則是為了防止檔案名裡帶空格而寫的參數。

第五句:

xargs我們之前說過,是将前面的結果轉化為輸入,那麼這個-0又是什麼意思?man一下xargs,我們看到-0表示讀取參數的時候以null為分隔符讀取,這也不難了解,畢竟null的二進制表示就是00。後面的md5sum是指計算輸入的md5值。

第六句:sort是排序,這個我們前面也見過。

第七句:

uniq -w32是指尋找前32個字元相同的行,原因在于md5值一定是32位的,而後面的--all-repeated=separate是指将重複的部分放在一類,分類輸出。

第八句:

由于我們的結果帶着md5值,不是很好看,是以我們截取md5值後面的部分,cut是文本處理函數,這裡-b 36-是指隻要每行36個字元之後的部分。

我們将上述每個指令用管道連結起來,存入result.txt:

雖然結果很好看,但是有一個問題,這是在linux下很好看,實際上如果有朋友把輸出檔案放到windows上,就會發現換行全沒了,這是由于linux下的換行是n,而windows要求nr,為了解決這個問題,我們最後執行一條指令,将n轉換為nr:

繼續閱讀