如何在 Linux 上識別同樣內容的檔案
有時檔案副本相當於對硬碟空間的巨大浪費,並會在你想要更新檔案時造成困擾。以下是用來識別這些檔案的六個命令。
在最近的帖子中,我們看了如何識別並定位硬連結的檔案(即,指向同一硬碟內容並共享 inode)。在本文中,我們將檢視能找到具有相同內容,卻不相連結的檔案的命令。
硬連結很有用是因為它們能夠使檔案存放在檔案系統內的多個地方卻不會佔用額外的硬碟空間。另一方面,有時檔案副本相當於對硬碟空間的巨大浪費,在你想要更新檔案時也會有造成困擾之虞。在本文中,我們將看一下多種識別這些檔案的方式。
用 diff 命令比較檔案
可能比較兩個檔案最簡單的方法是使用 diff
命令。輸出會顯示你檔案的不同之處。<
和 >
符號代表在當引數傳過來的第一個(<
)或第二個(>
)檔案中是否有額外的文字行。在這個例子中,在 backup.html
中有額外的文字行。
$ diff index.html backup.html
2438a2439,2441
> <pre>
> That's all there is to report.
> </pre>
如果 diff
沒有輸出那代表兩個檔案相同。
$ diff home.html index.html
$
diff
的唯一缺點是它一次只能比較兩個檔案並且你必須指定用來比較的檔案,這篇帖子中的一些命令可以為你找到多個重複檔案。
使用校驗和
cksum
(checksum) 命令計算檔案的校驗和。校驗和是一種將文字內容轉化成一個長數字(例如2819078353 228029)的數學簡化。雖然校驗和並不是完全獨有的,但是檔案內容不同校驗和卻相同的概率微乎其微。
$ cksum *.html
2819078353 228029 backup.html
4073570409 227985 home.html
4073570409 227985 index.html
在上述示例中,你可以看到產生同樣校驗和的第二個和第三個檔案是如何可以被預設為相同的。
使用 find 命令
雖然 find
命令並沒有尋找重複檔案的選項,它依然可以被用來通過名字或型別尋找檔案並執行 cksum
命令。例如:
$ find . -name "*.html" -exec cksum {} \;
4073570409 227985 ./home.html
2819078353 228029 ./backup.html
4073570409 227985 ./index.html
使用 fslint 命令
fslint
命令可以被特地用來尋找重複檔案。注意我們給了它一個起始位置。如果它需要遍歷相當多的檔案,這就需要花點時間來完成。注意它是如何列出重複檔案並尋找其它問題的,比如空目錄和壞 ID。
$ 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
你可能需要在你的系統上安裝 fslint
。你可能也需要將它加入你的命令搜尋路徑:
$ export PATH=$PATH:/usr/share/fslint/fslint
使用 rdfind 命令
rdfind
命令也會尋找重複(相同內容的)檔案。它的名字意即“重複資料搜尋”,並且它能夠基於檔案日期判斷哪個檔案是原件——這在你選擇刪除副本時很有用因為它會移除較新的檔案。
$ rdfind ~
Now scanning "/home/shark", 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/shark", 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
)的功能。檢視 man 頁面獲取解釋。
-ignoreempty ignore empty files
-minsize ignore files smaller than speficied size
-followsymlinks follow symbolic links
-removeidentinode remove files referring to identical inode
-checksum identify checksum type to be used
-deterministic determiness how to sort files
-makesymlinks turn duplicate files into symbolic links
-makehardlinks replace duplicate files with hard links
-makeresultsfile create a results file in the current directory
-outputname provide name for results file
-deleteduplicates delete/unlink duplicate files
-sleep set sleep time between reading files (milliseconds)
-n, -dryrun display what would have been done, but don't do it
注意 rdfind
命令提供了 -deleteduplicates true
的設定選項以刪除副本。希望這個命令語法上的小問題不會惹惱你。;-)
$ rdfind -deleteduplicates true .
...
Deleted 1 files. <==
你將可能需要在你的系統上安裝 rdfind
命令。試驗它以熟悉如何使用它可能是一個好主意。
使用 fdupes 命令
fdupes
命令同樣使得識別重複檔案變得簡單。它同時提供了大量有用的選項——例如用來迭代的 -r
。在這個例子中,它像這樣將重複檔案分組到一起:
$ fdupes ~
/home/shs/UPGRADE
/home/shs/mytwin
/home/shs/lp.txt
/home/shs/lp.man
/home/shs/penguin.png
/home/shs/penguin0.png
/home/shs/hideme.png
這是使用迭代的一個例子,注意許多重複檔案是重要的(使用者的 .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
fdupe
命令的許多選項列如下。使用 fdupes -h
命令或者閱讀 man 頁面獲取詳情。
-r --recurse recurse
-R --recurse: recurse through specified directories
-s --symlinks follow symlinked directories
-H --hardlinks treat hard links as duplicates
-n --noempty ignore empty files
-f --omitfirst omit the first file in each set of matches
-A --nohidden ignore hidden files
-1 --sameline list matches on a single line
-S --size show size of duplicate files
-m --summarize summarize duplicate files information
-q --quiet hide progress indicator
-d --delete prompt user for files to preserve
-N --noprompt when used with --delete, preserve the first file in set
-I --immediate delete duplicates as they are encountered
-p --permissions don't soncider files with different owner/group or
permission bits as duplicates
-o --order=WORD order files according to specification
-i --reverse reverse order while sorting
-v --version display fdupes version
-h --help displays help
fdupes
命令是另一個你可能需要安裝並使用一段時間才能熟悉其眾多選項的命令。
總結
Linux 系統提供能夠定位並(潛在地)能移除重複檔案的一系列的好工具,以及能讓你指定搜尋區域及當對你所發現的重複檔案時的處理方式的選項。
作者:Sandra Henry-Stocker 選題:lujun9972 譯者:tomjlw 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- 如何識別 Linux 上的檔案分身Linux
- 怎樣理解和識別 Linux 中的檔案型別Linux型別
- Linux檔案內容操作Linux
- ftp上直接修改檔案內容FTP
- linux下gzip壓縮同樣內容大小不一樣Linux
- java檔案相關(檔案追加內容、檔案內容清空、檔案內容讀取)Java
- Linux下清空檔案內容的方法Linux
- linux 檢視檔案內容的命令Linux
- 內容管理與知識管理的異同
- Linux檔案內容查詢命令Linux
- linux-批次修改檔案內容Linux
- linux 下 對檔案內容的查詢Linux
- input[type=file] 獲取上傳檔案的內容
- java通過檔案頭內容判斷檔案型別Java型別
- Linux 檢視檔案內容——bat 命令LinuxBAT
- Linux檔案內容查詢命令(轉)Linux
- Linux 檔案內容統計命令(轉)Linux
- linux 監控檔案內容變化Linux
- dump日誌檔案的內容的研究(看別人的)
- 如何在 Linux 上建立和使用交換檔案Linux
- Linux檔案內容檢視相關命令Linux
- Linux 檔案內容檢視工具介紹Linux
- linux下批次替換檔案內容(摘)Linux
- 常用的7個Linux檔案內容檢視命令!Linux
- pytesseract實現識別pdf檔案並將內容寫入word文件中
- 檔案內容拷貝
- Oracle 控制檔案內容Oracle
- 檔案內容比較
- vim內替換檔案內容
- linux 搜尋檔案及所有子目錄下的檔案裡的內容 (轉)Linux
- linux下使用find xargs grep查詢檔案及檔案內容Linux
- Linux學習之常用的Linux檔案內容檢視命令!Linux
- LINUX學習(六)Linux檔案內容統計命令Linux
- 如何在 Linux 上重新命名一組檔案Linux
- 用linux shell逐行讀取文字檔案內容Linux
- Linux 檔案、內容查詢(遞迴) ,grep ,findLinux遞迴
- Linux檢視檔案內容常用命令Linux
- vite vue-cli 讀取檔案原始內容 使用base64內容的檔案ViteVue