如何在 Linux 中找到並刪除重複文件

Linux愛好者2018-12-09 03:02:40

(點擊上方公號,快速關注我們)


英文:SK,翻譯:Linux中國/Andy Luo

linux.cn/article-10123-1.html



在編輯或修改配置文件或舊文件前,我經常會把它們備份到硬盤的某個地方,因此我如果意外地改錯了這些文件,我可以從備份中恢復它們。但問題是如果我忘記清理備份文件,一段時間之後,我的磁盤會被這些大量重複文件填滿 —— 我覺得要麼是懶得清理這些舊文件,要麼是擔心可能會刪掉重要文件。如果你們像我一樣,在類 Unix 操作系統中,大量多版本的相同文件放在不同的備份目錄,你可以使用下面的工具找到並刪除重複文件。


提醒一句:


在刪除重複文件的時請儘量小心。如果你不小心,也許會導致意外丟失數據。我建議你在使用這些工具的時候要特別注意。


在 Linux 中找到並刪除重複文件


出於本指南的目的,我將討論下面的三個工具:


  1. Rdfind

  2. Fdupes

  3. FSlint


這三個工具是自由開源的,且運行在大多數類 Unix 系統中。


1. Rdfind


Rdfind 意即 redundant data find(冗餘數據查找),是一個通過訪問目錄和子目錄來找出重複文件的自由開源的工具。它是基於文件內容而不是文件名來比較。Rdfind 使用排序算法來區分原始文件和重複文件。如果你有兩個或者更多的相同文件,Rdfind 會很智能的找到原始文件並認定剩下的文件為重複文件。一旦找到副本文件,它會向你報告。你可以決定是刪除還是使用硬鏈接或者符號(軟)鏈接代替它們。


安裝 Rdfind


Rdfind 存在於 AUR 中。因此,在基於 Arch 的系統中,你可以像下面一樣使用任一如 YayAUR 程序助手安裝它。


$ yay -S rdfind


在 Debian、Ubuntu、Linux Mint 上:


$ sudo apt-get install rdfind


在 Fedora 上:


$ sudo dnf install rdfind


在 RHEL、CentOS 上:


$ sudo yum install epel-release

$ sudo yum install rdfind


用法


一旦安裝完成,僅帶上目錄路徑運行 Rdfind 命令就可以掃描重複文件。


$ rdfind ~/Downloads



正如你看到上面的截屏,Rdfind 命令將掃描 ~/Downloads 目錄,並將結果存儲到當前工作目錄下一個名為 results.txt 的文件中。你可以在 results.txt 文件中看到可能是重複文件的名字。



通過檢查 results.txt 文件,你可以很容易的找到那些重複文件。如果願意你可以手動的刪除它們。


此外,你可在不修改其他事情情況下使用 -dryrun 選項找出所有重複文件,並在終端上輸出彙總信息。


$ rdfind -dryrun true ~/Downloads


一旦找到重複文件,你可以使用硬鏈接或符號鏈接代替他們。


使用硬鏈接代替所有重複文件,運行:


$ rdfind -makehardlinks true ~/Downloads


使用符號鏈接/軟鏈接代替所有重複文件,運行:


$ rdfind -makesymlinks true ~/Downloads


目錄中有一些空文件,也許你想忽略他們,你可以像下面一樣使用 -ignoreempty 選項:


$ rdfind -ignoreempty true ~/Downloads


如果你不再想要這些舊文件,刪除重複文件,而不是使用硬鏈接或軟鏈接代替它們。


刪除重複文件,就運行:


$ rdfind -deleteduplicates true ~/Downloads


如果你不想忽略空文件,並且和所喲重複文件一起刪除。運行:


$ rdfind -deleteduplicates true -ignoreempty false ~/Downloads


更多細節,參照幫助部分:


$ rdfind --help


手冊頁:


$ man rdfind


2. Fdupes


Fdupes 是另一個在指定目錄以及子目錄中識別和移除重複文件的命令行工具。這是一個使用 C 語言編寫的自由開源工具。Fdupes 通過對比文件大小、部分 MD5 簽名、全部 MD5 簽名,最後執行逐個字節對比校驗來識別重複文件。


與 Rdfind 工具類似,Fdupes 附帶非常少的選項來執行操作,如:


  • 在目錄和子目錄中遞歸的搜索重複文件

  • 從計算中排除空文件和隱藏文件

  • 顯示重複文件大小

  • 出現重複文件時立即刪除

  • 使用不同的擁有者/組或權限位來排除重複文件

  • 更多


安裝 Fdupes


Fdupes 存在於大多數 Linux 發行版的默認倉庫中。


在 Arch Linux 和它的變種如 Antergos、Manjaro Linux 上,如下使用 Pacman 安裝它。


$ sudo pacman -S fdupes


在 Debian、Ubuntu、Linux Mint 上:


$ sudo apt-get install fdupes


在 Fedora 上:


$ sudo dnf install fdupes


在 RHEL、CentOS 上:


$ sudo yum install epel-release

$ sudo yum install fdupes


用法


Fdupes 用法非常簡單。僅運行下面的命令就可以在目錄中找到重複文件,如:~/Downloads。


$ fdupes ~/Downloads


我係統中的樣例輸出:


/home/sk/Downloads/Hyperledger.pdf

/home/sk/Downloads/Hyperledger(1).pdf


你可以看到,在 /home/sk/Downloads/ 目錄下有一個重複文件。它僅顯示了父級目錄中的重複文件。如何顯示子目錄中的重複文件?像下面一樣,使用 -r 選項。


$ fdupes -r ~/Downloads


現在你將看到 /home/sk/Downloads/ 目錄以及子目錄中的重複文件。


Fdupes 也可用來從多個目錄中迅速查找重複文件。


$ fdupes ~/Downloads ~/Documents/ostechnix


你甚至可以搜索多個目錄,遞歸搜索其中一個目錄,如下:


$ fdupes ~/Downloads -r ~/Documents/ostechnix


上面的命令將搜索 ~/Downloads 目錄,~/Documents/ostechnix 目錄和它的子目錄中的重複文件。


有時,你可能想要知道一個目錄中重複文件的大小。你可以使用 -S 選項,如下:


$ fdupes -S ~/Downloads

403635 bytes each:

/home/sk/Downloads/Hyperledger.pdf

/home/sk/Downloads/Hyperledger(1).pdf


類似的,為了顯示父目錄和子目錄中重複文件的大小,使用 -Sr 選項。


我們可以在計算時分別使用 -n 和 -A 選項排除空白文件以及排除隱藏文件。


$ fdupes -n ~/Downloads

$ fdupes -A ~/Downloads


在搜索指定目錄的重複文件時,第一個命令將排除零長度文件,後面的命令將排除隱藏文件。


彙總重複文件信息,使用 -m 選項。


$ fdupes -m ~/Downloads

1 duplicate files (in 1 sets), occupying 403.6 kilobytes


刪除所有重複文件,使用 -d 選項。


$ fdupes -d ~/Downloads


樣例輸出:



這個命令將提示你保留還是刪除所有其他重複文件。輸入任一號碼保留相應的文件,並刪除剩下的文件。當使用這個選項的時候需要更加註意。如果不小心,你可能會刪除原文件。


如果你想要每次保留每個重複文件集合的第一個文件,且無提示的刪除其他文件,使用 -dN 選項(不推薦)。


$ fdupes -dN ~/Downloads


當遇到重複文件時刪除它們,使用 -I 標誌。


$ fdupes -I ~/Downloads


關於 Fdupes 的更多細節,查看幫助部分和 man 頁面。


$ fdupes --help

$ man fdupes


3. FSlint


FSlint 是另外一個查找重複文件的工具,有時我用它去掉 Linux 系統中不需要的重複文件並釋放磁盤空間。不像另外兩個工具,FSlint 有 GUI 和 CLI 兩種模式。因此對於新手來說它更友好。FSlint 不僅僅找出重複文件,也找出壞符號鏈接、壞名字文件、臨時文件、壞的用戶 ID、空目錄和非精簡的二進制文件等等。


安裝 FSlint


FSlint 存在於 AUR,因此你可以使用任一 AUR 助手安裝它。


$ yay -S fslint


在 Debian、Ubuntu、Linux Mint 上:


$ sudo apt-get install fslint


在 Fedora 上:


$ sudo dnf install fslint


在 RHEL,CentOS 上:


$ sudo yum install epel-release

$ sudo yum install fslint


一旦安裝完成,從菜單或者應用程序啟動器啟動它。


FSlint GUI 展示如下:



如你所見,FSlint 界面友好、一目瞭然。在 “Search path” 欄,添加你要掃描的目錄路徑,點擊左下角 “Find” 按鈕查找重複文件。驗證遞歸選項可以在目錄和子目錄中遞歸的搜索重複文件。FSlint 將快速的掃描給定的目錄並列出重複文件。



從列表中選擇那些要清理的重複文件,也可以選擇 “Save”、“Delete”、“Merge” 和 “Symlink” 操作他們。


在 “Advanced search parameters” 欄,你可以在搜索重複文件的時候指定排除的路徑。



FSlint 命令行選項


FSlint 提供下面的 CLI 工具集在你的文件系統中查找重複文件。


  • findup — 查找重複文件

  • findnl — 查找名稱規範(有問題的文件名)

  • findu8 — 查找非法的 utf8 編碼的文件名

  • findbl — 查找壞鏈接(有問題的符號鏈接)

  • findsn — 查找同名文件(可能有衝突的文件名)

  • finded — 查找空目錄

  • findid — 查找死用戶的文件

  • findns — 查找非精簡的可執行文件

  • findrs — 查找文件名中多餘的空白

  • findtf — 查找臨時文件

  • findul — 查找可能未使用的庫

  • zipdir — 回收 ext2 目錄項下浪費的空間


所有這些工具位於 /usr/share/fslint/fslint/fslint 下面。


例如,在給定的目錄中查找重複文件,運行:


$ /usr/share/fslint/fslint/findup ~/Downloads/


類似的,找出空目錄命令是:


$ /usr/share/fslint/fslint/finded ~/Downloads/


獲取每個工具更多細節,例如:findup,運行:


$ /usr/share/fslint/fslint/findup --help


關於 FSlint 的更多細節,參照幫助部分和 man 頁。


$ /usr/share/fslint/fslint/fslint --help

$ man fslint


總結


現在你知道在 Linux 中,使用三個工具來查找和刪除不需要的重複文件。這三個工具中,我經常使用 Rdfind。這並不意味著其他的兩個工具效率低下,因為到目前為止我更喜歡 Rdfind。好了,到你了。你的最喜歡哪一個工具呢?為什麼?在下面的評論區留言讓我們知道吧。


就到這裡吧。希望這篇文章對你有幫助。更多的好東西就要來了,敬請期待。


謝謝!



【關於投稿】


如果大家有原創好文投稿,請直接給公號發送留言。


① 留言格式:
【投稿】+《 文章標題》+ 文章鏈接

② 示例:
【投稿】
《不要自稱是程序員,我十多年的 IT 職場總結》:

http://blog.jobbole.com/94148/


③ 最後請附上您的個人簡介哈~


看完本文有收穫?請分享給更多人

關注「Linux 愛好者」,提升Linux技能

閱讀原文