前一段時間在開發一個比較複雜的shell腳本,目標之一是希望能夠拷貝到任何台機器上都能用(當然不包括win),所以腳本不會用到很多需要安裝的命令,所使用的命令基本都是系統安裝時候就自帶的。我的開發環境是mac,本以為很多基礎的命令mac和linux應該都一樣,沒想到過程中還是遇到不少有細微差別的地方。字符串計算MD5就是其中之一,這篇文章簡單記錄一下兩個系統在計算MD5時的差異,其他的差異以後有機會再聊
Linux:md5sum
命令説明
linux下獲取md5的命令是md5sum,下面是他的幫助文件。從幫助文檔看,linux的md5sum命令主要是用來計算文件md5值的,一段文本的計算只是附帶的一個功能
Usage: md5sum [OPTION]... [FILE]...
Print or check MD5 (128-bit) checksums.
With no FILE, or when FILE is -, read standard input.
-b, --binary read in binary mode
-c, --check read MD5 sums from the FILEs and check them
--tag create a BSD-style checksum
-t, --text read in text mode (default)
Note: There is no difference between binary and text mode option on GNU system.
The following four options are useful only when verifying checksums:
--quiet don't print OK for each successfully verified file
--status don't output anything, status code shows success
--strict exit non-zero for improperly formatted checksum lines
-w, --warn warn about improperly formatted checksum lines
--help display this help and exit
--version output version information and exit
文本輸出
測試文本輸出md5
>> echo "abcd"|md5sum
f5ac8127b3b6b85cdc13f237c6005d80 -
這和網上工具算的不一樣,原因是echo會自動加一個換行符,可以使用-n參數不輸出這個換行符
不輸出換行符再試一下
>> echo -n "abcd"|md5sum
e2fc714c4727ee9395f324cd2e7f331f -
這次和工具算出來一樣了
文件校驗
測試對一個文件進行校驗,最簡單的命令如下
>> md5sum Document.pdf
20b1f7a03886e2acb4a1127b46f32428 Document.pdf
會輸出文件的md5值和文件名
配合find命令可以快速查看一個目錄下所有文件的md5
>> find ./|xargs md5sum
md5sum: ./: Is a directory
0f8cd5b583b41d39b31ead87aa0e58fe ./BeanContextChildComponentProxy.java
b2125086af1459eb370b3636bc74e07e ./BeanContextServices.java
c14ec136adc6c9732639e38389b64031 ./BeanContextServiceProvider.java
9c052aec2e7e62a90b2be9cbe78df45a ./BeanContextChild.java
e9545230bde1ccef1cee14a5b44c3d37 ./BeanContextServicesSupport.java
3f52d9ce3ea8c71600a3984da10afaff ./BeanContextProxy.java
8f3843de53a38dfb35557be11d49dc88 ./BeanContextContainerProxy.java
9e95824832d9a6a6278c169df77db967 ./BeanContextSupport.java
3915c59e175dea7a84fb5a0ff00dd28e ./BeanContextMembershipEvent.java
205ac68eef169a48858484f83991cdc9 ./BeanContext.java
7df33512aa2b57677b6873d5f94ef306 ./BeanContextServicesListener.java
c4cebd9f0b4d6247f7cd65707fda3f44 ./BeanContextServiceRevokedEvent.java
e9b6ce291daaf950bdff0b652e0f591c ./BeanContextMembershipListener.java
38512603934c9a8812392fe44422b898 ./BeanContextChildSupport.java
8e95864a4164640351f851062724c3f3 ./BeanContextEvent.java
4f55377474508514123b3625b8ffe6de ./BeanContextServiceAvailableEvent.java
f06a414d8bdf87548feb954b970d5026 ./BeanContextServiceProviderBeanInfo.java
86587d95875f3616d519147378dd8797 ./BeanContextServiceRevokedListener.java
我們有了md5值那如何做校驗呢
讓我們先把md5sum的結果寫入一個文件
>> md5sum Document.pdf >> check.out
>> cat check.out
20b1f7a03886e2acb4a1127b46f32428 Document.pdf
使用-c參數來進行校驗
>> md5sum -c check.out
Document.pdf: OK
可以看到校驗成功,這裏注意,-c後面直接跟校驗文件,程序是根據校驗文件中保存的文件名來以當前執行目錄為準進行尋找的,所以要保證這個文件對於執行目錄的相對路徑正確,或者改成絕對路徑也行
>> cat check.out
20b1f7a03886e2acb4a1127b46f32428 /root/Document.pdf
>> md5sum -c check.out
/root/Document.pdf: OK
如果是多個文件呢,只要在校驗文件中保存多個文件的校驗結果即可
>> echo "abc" >> test.txt
>> md5sum test.txt >> check.out
>> cat check.out
20b1f7a03886e2acb4a1127b46f32428 Document.pdf
0bee89b07a248e27c83fc3d5951213c1 test.txt
>> md5sum -c check.out
Document.pdf: OK
test.txt: OK
>> echo "abc" >> test.txt
>> md5sum -c check.out
Document.pdf: OK
test.txt: FAILED
md5sum: WARNING: 1 of 2 computed checksums did NOT match
如果有校驗失敗的文件,會提示有幾個失敗了
MAC:md5
命令説明
mac下獲取md5的命令是md5,下面是他的幫助文件。mac下的md5命令就明顯提升了string計算md5值的地位,在概要裏面明確説明了string的用法
NAME
md5 – calculate a message-digest fingerprint (checksum) for a file
SYNOPSIS
md5 [-pqrtx] [-s string] [file ...]
-s string
Print a checksum of the given string.
-p Echo stdin to stdout and append the checksum to stdout.
-q Quiet mode - only the checksum is printed out. Overrides the -r option.
-r Reverses the format of the output. This helps with visual diffs. Does nothing when combined with the -ptx options.
-t Run a built-in time trial.
-x Run a built-in test script.
文本輸出
測試輸出md5,用管道的話,也無須-s命令
>> echo "abcd"|md5
f5ac8127b3b6b85cdc13f237c6005d80
echo有同樣的補換行符機制
不輸出換行符試一下
>> echo -n "abcd"|md5
e2fc714c4727ee9395f324cd2e7f331f
一樣了
注意:mac下獲取的結果格式和linux下有所不同
文件校驗
讓我們在mac下同樣進行文件校驗的測試,最簡單的命令如下
>> md5 web.zip
MD5 (web.zip) = 73664fc49bc0ae831f73fd58530f690c
格式和linux下面差別還挺大,也會輸出文件的md5值和文件名
不過使用-r參數之後就可以獲得和linux下相同格式的輸出了
>> md5 -r web.zip
73664fc49bc0ae831f73fd58530f690c web.zip
配合find命令也可以快速查看一個目錄下所有文件的md5
>> find ./|xargs md5
md5: ./: Is a directory
MD5 (.//BackendException.java) = 693d6290c249190f53bf2c4189df3ddd
MD5 (.//UnknownDatabaseException.java) = 0ecdbba3648a6d025b59577ecf2b1e74
MD5 (.//TableModifyInTransactionException.java) = a21eb795866bc59aadc79c7c3f7e94e8
MD5 (.//NoDatabaseSelectedException.java) = 9fda10bd220ed214c1954a6713022a32
我們有了md5值那如何做校驗呢
很遺憾,mac下的md5命令並沒有類似md5sum的校驗快捷功能
不過可以通過shell腳本來進行比對,就不在此舉例了