管是 Windows 電腦還是 Linux 電腦,在使用的過程中,或多或少都會留下很多重復(fù)的文件。這些文件不僅會占用我們的磁盤,還會拖累我們的系統(tǒng),所以,很有必要干掉這些重復(fù)的文件。
本文將介紹 6 種方法找到系統(tǒng)里的重復(fù)文件,讓你快速釋放硬盤空間!
在我們平常操作當(dāng)中,比較兩個文件的差異最簡單的方法可能就是使用 diff 命令。diff 命令的輸出將使用 < 和 > 符號顯示兩個文件之間的差異,利用這個特性我們可以找到相同的文件。
當(dāng)兩個文件有差異時,diff 命令將輸出差異點:
$ diff index.html backup.html
2438a2439,2441
> <pre>
> That's all there is to report.
> </pre>
如果你的 diff 命令沒有輸出,則表示兩個文件相同:
$ diff home.html index.html
$
但是, diff 命令的缺點是它一次只能比較兩個文件,如果我們要比較多個文件,這樣兩個兩個比較效率肯定非常低下。
校驗和命令 cksum 會根據(jù)一定的算法將文件的內(nèi)容計算成一個很長的數(shù)字(如2819078353 228029)。雖然算出的結(jié)果不是絕對唯一,但是內(nèi)容不相同的文件導(dǎo)致校驗和相同的可能性跟中國男足進(jìn)世界杯差不多。
$ cksum *.html
2819078353 228029 backup.html
4073570409 227985 home.html
4073570409 227985 index.html
在我們上面的操作中,我們可以看到第二個和第三個文件校驗和是相同的,所以我們可以認(rèn)為這兩個文件是一樣的。
雖然 find 命令沒有查找重復(fù)文件的選項,但是它卻可用于按名稱或類型搜索文件并運行cksum 命令。具體操作如下。
$ find . -name "*.html" -exec cksum {} \;
4073570409 227985 ./home.html
2819078353 228029 ./backup.html
4073570409 227985 ./index.html
fslint 命令可以用來專門查找重復(fù)文件。但是這里有個注意事項,就是我們需要給它一個起始位置。如果我們需要運行大量文件,該命令可能需要相當(dāng)長的時間才能完成查找。
$ 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:我們必須在系統(tǒng)上安裝 fslint ,還需要將它添加到搜索路徑中:
$ export PATH=$PATH:/usr/share/fslint/fslint
rdfind 命令還將尋找重復(fù)的(相同內(nèi)容的)文件。被稱為“冗余數(shù)據(jù)查找”,該命令可以根據(jù)文件日期確定哪些文件是原始文件,這對我們選擇刪除重復(fù)項很有幫助,因為它會刪除較新的文件。
$ 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)之類的選項。下面詳細(xì)解釋它的常用選項。
選項 意義 -ignoreempty 忽略空文件 -minsize 忽略小于特定大小的文件 -followsymlink 遵循符號鏈接 -removeidentinode 刪除引用相同inode的文件 -checksum 標(biāo)識要使用的校驗和類型 -deterministic 決定如何排序文件 -makesymlinks 將重復(fù)文件轉(zhuǎn)換為符號鏈接 -makehardlinks 用硬鏈接替換重復(fù)文件 -makeresultsfile 在當(dāng)前目錄中創(chuàng)建結(jié)果文件 -outputname 提供結(jié)果文件的名稱 -deleteduplicates 刪除/取消鏈接重復(fù)文件 -sleep 設(shè)置讀取文件之間的休眠時間(毫秒) -n,-dryrun 顯示本應(yīng)執(zhí)行的操作,但不要執(zhí)行
這里需要我們注意一下,rdfind命令提供了使用 -deleteduplicates true 設(shè)置刪除重復(fù)文件的選項。顧名思義,使用這個選項它將自動刪重復(fù)的文件。
$ rdfind -deleteduplicates true .
...
Deleted 1 files. <==
當(dāng)然,前提是我們也必須在系統(tǒng)上安裝 rdfind 命令。
fdupes 命令也可以很容易地識別重復(fù)文件,并提供了大量有用的選項。在最簡單的操作中,它會把重復(fù)文件放在一起,如下所示:
$ 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 選項代表遞歸,表示它將在各個目錄下面使用遞歸的方式來查找重復(fù)文件。但是,Linux 下有許多重復(fù)文件是很重要的(比如用戶的 .bashrc 和 .profile 文件),如果被刪除將導(dǎo)致系統(tǒng)異常。
# 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 將硬鏈接視為重復(fù)鏈接 -n --noempty 忽略空文件 -f --omitfirst 省略每組匹配中的第一個文件 -A --nohidden 忽略隱藏文件 -1 --sameline 相同列表匹配單行 -S --size 顯示重復(fù)文件的大小 -m --summarize 匯總重復(fù)文件信息 -q --quiet 進(jìn)度指示器 -d --delete 提示用戶保存文件 -N --noprompt 與--delete一起使用時無效,保留集合中的第一個文件 -I --immediate 在遇到它們時刪除重復(fù)項 -p --permissions 權(quán)限不會將具有不同所有者/組或權(quán)限位的SONCIDER文件作為重復(fù)項 -o --order=WORD 根據(jù)規(guī)范的WORD訂單文件 -i --reverse 排序時反向逆序 -v --version 顯示fdupes版本 -h --help 顯示幫助
Linux 系統(tǒng)為我們提供了很多用于定位和刪除重復(fù)文件的工具,使用這些工具將快速找到磁盤里的重復(fù)文件并刪除它們。希望本次分享能給大家?guī)韼椭鷡
概念:
磁盤分區(qū)組成部分:Block存儲區(qū) 和 inodes 存儲區(qū)。
Block存儲區(qū):存儲文件的數(shù)據(jù)內(nèi)容
inodes存儲區(qū):由許多的inode組成的列表,每個 inode 中存儲 文件屬性信息(文件大小,創(chuàng)建者,創(chuàng)建時間等)
每一個磁盤分區(qū)inodes的大小是有限制的,當(dāng)inodes的使用率很高時,就會存在文件無法寫入的風(fēng)險。
inodes存儲文件屬性信息:
1、文件大小
2、文件類型(常規(guī)文件、目錄、軟連接等)
3、權(quán)限(讀寫執(zhí)行權(quán)限)
4、屬主(所屬用戶)
5、屬組(所屬用戶組)
6、鏈接數(shù)(有多少個文件名指向這個inode)
7、文件創(chuàng)建時間
8、文件最近訪問時間
9、文件最近修改時間
10、文件內(nèi)容所在Block位置
#查看文件inode信息
stat test.txt
inodes編號:
每一個文件都有一個inode編號,根據(jù)iNode編號獲取inodes信息,從而獲取文件存儲在blocked區(qū)的位置信息,從block存儲區(qū)中讀取文件內(nèi)容。
#查看文件名對應(yīng)的inode號碼
ls -li
inodes大小:
每個inode節(jié)點的大小,一般是128字節(jié)或256字節(jié)。inode節(jié)點的總數(shù),在格式化時就給定,一般是每1KB或每2KB就設(shè)置一個inode。假定在一塊1GB的硬盤中,每個inode節(jié)點的大小為128字節(jié),每1KB就設(shè)置一個inode,那么inode table的大小就會達(dá)到128MB,占整塊硬盤的12.8%。
#查看每一個inodes節(jié)點信息大小:
#dumpe2fs -h /dev/vda1 | grep "Inode size"
dumpe2fs 1.42.9 (28-Dec-2013)
Inode size: 128
查看每個文件系統(tǒng)中 inode 的使用情況:
df -ih
系統(tǒng)查看文件內(nèi)容過程:
獲取目錄的inode編號--->找到目錄文件block數(shù)據(jù)塊--->找到目錄下某一個文件的inode編號--->找到文件block塊--->讀取block塊中的數(shù)據(jù)
通過inode編號查找文件:
find . -inum 3412
通過 inode 刪除文件:
find -inum 3412 -delete