1. 程式人生 > >如何找到系統裡的重複檔案,快速釋放磁碟空間?

如何找到系統裡的重複檔案,快速釋放磁碟空間?

不管是 Windows 電腦還是 Linux 電腦,在使用的過程中,或多或少都會留下很多重複的檔案。這些檔案不僅會佔用我們的磁碟,還會拖累我們的系統,所以,很有必要幹掉這些重複的檔案。 本文將介紹 6 種方法找到系統裡的重複檔案,讓你快速釋放硬碟空間! #### 1. 使用 diff 命令比較檔案 在我們平常操作當中,比較兩個檔案的差異最簡單的方法可能就是使用 `diff` 命令。diff 命令的輸出將使用 `<` 和 `>` 符號顯示兩個檔案之間的差異,利用這個特性我們可以找到相同的檔案。 當兩個檔案有差異時,diff 命令將輸出差異點: ``` $ diff index.html backup.html 2438a2439,2441 >
> That's all there is to report.
> 
``` 如果你的 diff 命令沒有輸出,則表示兩個檔案相同: ``` $ diff home.html index.html $ ``` 但是, diff 命令的缺點是它一次只能比較兩個檔案,如果我們要比較多個檔案,這樣兩個兩個比較效率肯定非常低下。 #### 2. 使用校驗和 校驗和命令 `cksum` 會根據一定的演算法將檔案的內容計算成一個很長的數字(如2819078353 228029)。雖然算出的結果不是絕對唯一,但是內容不相同的檔案導致校驗和相同的可能性跟中國男足進世界盃差不多。 ``` $ cksum *.html 2819078353 228029 backup.html 4073570409 227985 home.html 4073570409 227985 index.html ``` 在我們上面的操作中,我們可以看到第二個和第三個檔案校驗和是相同的,所以我們可以認為這兩個檔案是一樣的。 #### 3. 使用 find 命令 雖然 find 命令沒有查詢重複檔案的選項,但是它卻可用於按名稱或型別搜尋檔案並執行cksum 命令。具體操作如下。 ``` $ find . -name "*.html" -exec cksum {} \; 4073570409 227985 ./home.html 2819078353 228029 ./backup.html 4073570409 227985 ./index.html ``` #### 4. 使用 fslint 命令 `fslint` 命令可以用來專門查詢重複檔案。但是這裡有個注意事項,就是我們需要給它一個起始位置。如果我們需要執行大量檔案,該命令可能需要相當長的時間才能完成查詢。 ``` $ fslint . -----------------------------------file name lint -------------------------------Invalid utf8 names -----------------------------------file case lint ----------------------------------DUPlicate files <== home.html index.html -----------------------------------Dangling links --------------------redundant characters in links ------------------------------------suspect links --------------------------------Empty Directories ./.gnupg ----------------------------------Temporary Files ----------------------duplicate/conflicting Names ------------------------------------------Bad ids -------------------------Non Stripped executables ``` **Tips**:我們必須在系統上安裝 fslint ,還需要將它新增到搜尋路徑中: ``` $ export PATH=$PATH:/usr/share/fslint/fslint ``` #### 5. 使用 rdfind 命令 `rdfind` 命令還將尋找重複的(相同內容的)檔案。被稱為“冗餘資料查詢”,該命令可以根據檔案日期確定哪些檔案是原始檔案,這對我們選擇刪除重複項很有幫助,因為它會刪除較新的檔案。 ``` $ rdfind ~ Now scanning "/home/alvin", found 12 files. Now have 12 files in total. Removed 1 files due to nonunique device and inode. Total size is 699498 bytes or 683 KiB Removed 9 files due to unique sizes from list.2 files left. Now eliminating candidates based on first bytes:removed 0 files from list.2 files left. Now eliminating candidates based on last bytes:removed 0 files from list.2 files left. Now eliminating candidates based on sha1 checksum:removed 0 files from list.2 files left. It seems like you have 2 files that are not unique Totally, 223 KiB can be reduced. Now making results file results.txt ``` 我們還可以在 dryrun 中執行。 ``` $ rdfind -dryrun true ~ (DRYRUN MODE) Now scanning "/home/alvin", found 12 files. (DRYRUN MODE) Now have 12 files in total. (DRYRUN MODE) Removed 1 files due to nonunique device and inode. (DRYRUN MODE) Total size is 699352 bytes or 683 KiB Removed 9 files due to unique sizes from list.2 files left. (DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left. (DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left. (DRYRUN MODE) Now eliminating candidates based on sha1 checksum:removed 0 files from list.2 files left. (DRYRUN MODE) It seems like you have 2 files that are not unique (DRYRUN MODE) Totally, 223 KiB can be reduced. (DRYRUN MODE) Now making results file results.txt ``` rdfind 命令還提供一些忽略空檔案(-ignoreempty)和跟隨符號連結(-followsymlinks)之類的選項。下面詳細解釋它的常用選項。 | 選項 | 意義 | | ---- | ---- | | -ignoreempty | 忽略空檔案 | | -minsize | 忽略小於特定大小的檔案 | | -followsymlink | 遵循符號連結 | | -removeidentinode | 刪除引用相同inode的檔案 | | -checksum | 標識要使用的校驗和型別 | | -deterministic | 決定如何排序檔案 | | -makesymlinks | 將重複檔案轉換為符號連結 | | -makehardlinks | 用硬連結替換重複檔案 | | -makeresultsfile | 在當前目錄中建立結果檔案 | | -outputname | 提供結果檔案的名稱 | | -deleteduplicates | 刪除/取消連結重複檔案 | | -sleep | 設定讀取檔案之間的休眠時間(毫秒) | | -n,-dryrun | 顯示本應執行的操作,但不要執行 | 這裡需要我們注意一下,rdfind命令提供了使用 `-deleteduplicates true` 設定刪除重複檔案的選項。顧名思義,使用這個選項它將自動刪重複的檔案。 ``` $ rdfind -deleteduplicates true . ... Deleted 1 files. <== ``` 當然,前提是我們也必須在系統上安裝 rdfind 命令。 #### 6. 使用 fdupes 命令 `fdupes` 命令也可以很容易地識別重複檔案,並提供了大量有用的選項。在最簡單的操作中,它會把重複檔案放在一起,如下所示: ``` $ fdupes ~ /home/alvin/UPGRADE /home/alvin/mytwin /home/alvin/lp.txt /home/alvin/lp.man /home/alvin/penguin.png /home/alvin/penguin0.png /home/alvin/hideme.png ``` `-r` 選項代表遞迴,表示它將在各個目錄下面使用遞迴的方式來查詢重複檔案。但是,Linux 下有許多重複檔案是很重要的(比如使用者的 .bashrc 和 .profile 檔案),如果被刪除將導致系統異常。 ``` # fdupes -r /home /home/shark/home.html /home/shark/index.html /home/dory/.bashrc /home/eel/.bashrc /home/nemo/.profile /home/dory/.profile /home/shark/.profile /home/nemo/tryme /home/shs/tryme /home/shs/arrow.png /home/shs/PNGs/arrow.png /home/shs/11/files_11.zip /home/shs/ERIC/file_11.zip /home/shs/penguin0.jpg /home/shs/PNGs/penguin.jpg /home/shs/PNGs/penguin0.jpg /home/shs/Sandra_rotated.png /home/shs/PNGs/Sandra_rotated.png ``` fdupes 命令的常用選項如下表所示: | 選項 | 意義 | | ---- | ---- | | -r --recurse | 遞迴 | | -R --recurse | 遞迴指定的目錄 | | -s --symlinks-H --hardlinks | 遵循符號連結目錄 | | -H --hardlinks | 將硬連結視為重複連結 | | -n --noempty | 忽略空檔案 | | -f --omitfirst | 省略每組匹配中的第一個檔案 | | -A --nohidden | 忽略隱藏檔案 | | -1 --sameline | 相同列表匹配單行 | | -S --size | 顯示重複檔案的大小 | | -m --summarize | 彙總重複檔案資訊 | | -q --quiet | 進度指示器 | | -d --delete | 提示使用者儲存檔案 | | -N --noprompt | 與--delete一起使用時無效,保留集合中的第一個檔案 | | -I --immediate | 在遇到它們時刪除重複項 | | -p --permissions | 許可權不會將具有不同所有者/組或許可權位的SONCIDER檔案作為重複項 | | -o --order=WORD | 根據規範的WORD訂單檔案 | | -i --reverse | 排序時反向逆序 | | -v --version | 顯示fdupes版本 | | -h --help | 顯示幫助 | #### 小結 Linux 系統為我們提供了很多用於定位和刪除重複檔案的工具,使用這些工具將快速找到磁盤裡的重複檔案並刪除它們。希望本次分享能給大家帶來幫助~ \----------------- **良許**,**世界500強**外企 Linux 開發工程師,Linux 佈道者,歡迎關注我的公眾號「**良許Linux**」,滿滿都是乾貨! **→「技術乾貨推送」** **→「獨家資料共享」** **→「高手如雲社群」** 如果您對我的專題內容感興趣,也可以關注我的部落格:[lxlinux.net](https://www.lxlinux.net) ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200310124054028-884319