不管是 Windows 電腦還是 Linux 電腦,在使用的程序中,或多或少都會留下很多重復的檔案,這些檔案不僅會占用我們的磁盤,還會拖累我們的系統,所以,很有必要干掉這些重復的檔案,
本文將介紹 6 種方法找到系統里的重復檔案,讓你快速釋放硬碟空間!
1. 使用 diff 命令比較檔案
在我們平常操作當中,比較兩個檔案的差異最簡單的方法可能就是使用 diff 命令,diff 命令的輸出將使用 < 和 > 符號顯示兩個檔案之間的差異,利用這個特性我們可以找到相同的檔案,
當兩個檔案有差異時,diff 命令將輸出差異點:
$ diff index.html backup.html
2438a2439,2441
> <pre>
> That's all there is to report.
> </pre>
如果你的 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.uj5u.com/caozuo/134811.html
標籤:Linux
