天天看點

如何尋找并删除系統裡的重複檔案,快速釋放磁盤空間?

作者:Linux碼農

不管是 Windows 電腦還是 Linux 電腦,在使用的過程中,或多或少都會留下很多重複的檔案。這些檔案不僅會占用我們的磁盤,還會拖累我們的系統,是以,很有必要幹掉這些重複的檔案。

本文将介紹 6 種方法找到系統裡的重複檔案,讓你快速釋放硬碟空間!

1. 使用 diff 指令比較檔案

diff 指令是 linux上非常重要的工具,用于比較檔案的内容,特别是比較兩個版本不同的檔案以找到改動的地方。diff在指令行中列印每一個行的改動。最新版本的diff還支援二進制檔案。

diff程式的輸出被稱為更新檔 (patch),因為Linux系統中還有一個patch程式,可以根據diff的輸出将a.c的檔案内容更新為b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。

當兩個檔案有差異時,diff 指令将輸出差異點:

# cat a.txt
hello
abc
123

# cat b.txt
sldf
123
hello

#diff a.txt b.txt
1,2c1 
< hello
< abc
---
> sldf
3a3
> hello           

在 diff 中 diff 的 normal 顯示格式有三種提示:

a - add
c - change
d - delete           

從上面的差異可知,因為 a.txt 的第3行 和 b.txt的第2行相等,是以 1,2c1 顯示的是a.txt 的前2行和b.txt的第1行是不同的。

由于2個檔案的中的内容123相同,相對于内容123下面的行,b.txt 比 a.txt多了一行 hello

使用 diff 比較2個檔案夾

# diff adir bdir
diff adir/a.txt bdir/a.txt
1c1
< hello
---
> abc
Only in adir: b.txt
Only in bdir: c.txt           

從 diff 分析可知:

adir 檔案夾與 bdir 檔案夾各有一個 a.txt 檔案,其中第一行内容是不同的。a.txt 第一行内容時 hello, b.txt 第一行的内容時 abc。

同時,在 adir 檔案中存在一個檔案 b.txt, 在 bdir 檔案夾中存在一個檔案c.txt。

diff 指令的缺點是它一次隻能比較兩個檔案,如果我們要比較多個檔案,這樣兩個兩個比較效率肯定非常低下。

2. 使用校驗和

Linux cksum指令用于檢查檔案的CRC是否正确。確定檔案從一個系統傳輸到另一個系統的過程中不被損壞。是以,如果檔案中有任何字元被修改,都将改變計算後CRC校驗碼的值。

校驗和指令的原理是根據一定的算法将檔案内容進行運算生成一個校驗碼,根據校驗碼的不同來判斷檔案内容是否發生變化。

# diff a.txt b.txt //沒有輸出說明2個檔案内容是相同的
#
#
#cksum a.txt
2532900428 50 a.txt
#cksum b.txt
2532900428 50 b.txt           

上面的輸出資訊中,"2532900428 "表示校驗碼,"50"表示位元組數。

通過上面的校驗碼可知,a.txt 和 b.txt 内容是相同的。

3. 使用 find 指令

當需要判斷一類檔案時,可以根據find指令查找給定給定檔案,然後對這些檔案進行cksum校驗,輸出校驗碼,根據校驗碼進行判斷是否發生變化。

# find . -name "*.txt" -exec cksum {} \;
2532900428 50 ./a.txt
2532900428 50 ./b.txt
290493225 32 ./c.txt
25632541 27 ./d.txt           

根據校驗碼可知 a.txt 與 b.txt 相同,c.txt 與 d.txt 不同。

4. 使用 fslint 指令

fslint是一個Linux工具來删除檔案,檔案名不必要的和有問題的檔案,進而保持電腦清潔。

使用該工具時我們要有個注意事項,就是我們需要給它一個起始位置。如果我們需要運作大量檔案,該指令可能需要相當長的時間才能完成查找。

$ fslint .
-----------------------------------file name lint
-------------------------------Invalid utf8 names
-----------------------------------file case lint
----------------------------------DUPlicate files <==
a.txt
b.txt
-----------------------------------Dangling links
--------------------redundant characters in links
------------------------------------suspect links
--------------------------------Empty Directories
./.gnupg
----------------------------------Temporary Files
----------------------duplicate/conflicting Names
------------------------------------------Bad ids
-------------------------Non Stripped executables           

5. 使用 fdupes 指令

fdupes 是 Linux 下的一個工具,它由 Adrian Lopez 用C程式設計語言編寫并基于 MIT 許可證發行,該應用程式可以在指定的目錄及子目錄中查找重複的檔案。fdupes 通過對比檔案的 MD5 簽名,以及逐位元組比較檔案來識别重複内容,fdupes 有各種選項,可以實作對檔案的列出、删除、替換為檔案副本的硬連結等操作。

$ fdupes ~

/home/adir/a.txt
/home/adir/b.txt

/home/adir/go.png
/home/adir/go0.png
/home/adir/h.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           

fdupes 指令的常用選項如下表所示:

如何尋找并删除系統裡的重複檔案,快速釋放磁盤空間?

6. 使用 rdfind 指令

Rdfind 意即 redundant data find(備援資料查找),是一個通過通路目錄和子目錄來找出重複檔案的自由開源的工具。它是基于檔案内容而不是檔案名來比較。

Rdfind 使用排序算法來區分原始檔案和重複檔案。如果你有兩個或者更多的相同檔案,Rdfind 會很智能的找到原始檔案并認定剩下的檔案為重複檔案。一旦找到副本檔案,它會向你報告。你可以決定是删除還是使用硬連結或者符号(軟)連結代替它們。

$ rdfind ~
Now scanning "/opt/adir", 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 "/opt/adir", 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.
...           

rdfind 指令還提供一些忽略空檔案(-ignoreempty)和跟随符号連結(-followsymlinks)之類的選項。下面詳細解釋它的常用選項。

如何尋找并删除系統裡的重複檔案,快速釋放磁盤空間?

這裡需要我們注意一下,rdfind指令提供了使用 -deleteduplicates true 設定删除重複檔案的選項。顧名思義,使用這個選項它将自動删重複的檔案。

$ rdfind -deleteduplicates true .

...

Deleted 1 files. <==           

當然,前提是我們也必須在系統上安裝 rdfind 指令。

繼續閱讀