要是你懷疑可能有很多文件具有相同的內(nèi)文,而是用 cmp 或 diff 進(jìn)行比較所有橫隊(duì)的比較,導(dǎo)致所花費(fèi)的時(shí)間會(huì)隨著文件數(shù)目增長(zhǎng)成次方的增長(zhǎng).
這是可以使用 file checksum(文件校驗(yàn)和),取得近似線性的性能.有很多工具可用來(lái)計(jì)算文件與字符串的校驗(yàn)和,包括 sum,cksum,以及 checksum,消息摘要工具 md5 與 md5sum,安全性散列算法工具 sha,shalsum,sha256,以及sha384.
案例:
$echo -n "hello" | md5sum | cut -d ' ' -f1
5d41402abc4b2a76b9719d911017c592
分析:獲取字符串 hell 的 MD5.
md5sum : 顯示或檢查 MD5(128-bit)校驗(yàn)和,若沒(méi)有文件選項(xiàng),或者文件處為”-”,則從標(biāo)準(zhǔn)輸入讀取.
echo -n : 不打印換行
cut : cut 用來(lái)從標(biāo)準(zhǔn)輸入或文本文件中剪切列或域.剪切文本可以將之粘貼到一個(gè)文本文件.-d 指定域空格和 tab 鍵不同的域分隔符.-f1 表示第一個(gè)域.
校驗(yàn)程序用來(lái)從文件中生成校驗(yàn)密鑰,然后利用這個(gè)校驗(yàn)密碼核實(shí)文件的完整性.一般文件可以通過(guò)網(wǎng)絡(luò)分發(fā)帶不同的地點(diǎn).出于多種原因,數(shù)據(jù)有可能在傳輸過(guò)程中丟失若干位,從而導(dǎo)致文件的破壞.
因此我么需要采用一些測(cè)試方法去確定接收到的文件是否存在錯(cuò)誤.我們可以對(duì)原始文件和接收到的文件進(jìn)行校驗(yàn).
通過(guò)對(duì)比兩者的校驗(yàn)結(jié)果,就能夠核實(shí)接收到的文件是否正確.校驗(yàn)對(duì)于編寫備份腳本或系統(tǒng)維護(hù)腳本來(lái)說(shuō)很重要.
使用 md5sum 或 shalsum 進(jìn)行校驗(yàn)
最知名并且使用最廣泛的檢驗(yàn)和技術(shù)是 md5sum 和 shalsum.他們對(duì)文件內(nèi)容使用響應(yīng)的算法來(lái)生成校驗(yàn)結(jié)果.
為了計(jì)算 md5sum,使用下列命令:
$md5sum f1
42a6ab275d6ae3a62ab448fb44dffb8a f1
分析:得到的結(jié)果是一個(gè) 32 個(gè)字符的十六進(jìn)制字符串后面跟文件名.
將輸出的校驗(yàn)結(jié)果重定向到一個(gè)文件,然后用這個(gè) md5 文件核實(shí)數(shù)據(jù)的完整性:
md5sum f1>f1.MD5
可以按照下面的方法永盛成的文件何時(shí)數(shù)據(jù)完整性:
$md5sum -c f1.md5
f1: 確定
分析:如果出現(xiàn)確定,則證明文件無(wú)損.
shalsum 是另一個(gè)常用的檢驗(yàn)算法.他從給定的輸入文件中生成一個(gè)長(zhǎng)度為 40 個(gè)字符的十六進(jìn)制的字符串.其用法和 md5sum 非常相似.
可以對(duì)多個(gè)文件進(jìn)行校驗(yàn)
&md5sum f1 f2 > file.md5
$cat file.md5
42a6ab275d6ae3a62ab448fb44dffb8a f1
42a6ab275d6ae3a62ab448fb44dffb8a f2
分析:輸出中會(huì)在每行中包含單個(gè)文件的檢驗(yàn)結(jié)果字符串.
可以按照下面的方法用生成的文件核實(shí)數(shù)據(jù)完整性:
$md5sum -c file.md5
f1: 確定
f2: 確定
分析:這個(gè)命令會(huì)輸出校驗(yàn)結(jié)果是否匹配的消息
對(duì)于目錄進(jìn)行校驗(yàn)意味著我們需要對(duì)目錄中的所有文件以遞歸的方式進(jìn)行計(jì)算.
他可以使用命令 md5deep 或者 shaldeep 來(lái)實(shí)現(xiàn).首先,需要安裝 md5deep 軟件包可以確保能找到這些命令.用法如下:
$md5deep -rl directory_path>directory.md5
分析:-r 選項(xiàng)代表使用遞歸的方式,-l(小寫字母 L)使用相對(duì)路徑.默認(rèn)情況下回話輸出絕對(duì)路徑.
使用下面的命令進(jìn)行核實(shí):
$md5sum -c dircetory.md5