1. 程式人生 > >Shell命令-文件及目錄操作之file、md5sum

Shell命令-文件及目錄操作之file、md5sum

再次 需要 解釋 encoding 16進制 錯誤信息 args 網絡傳輸 進制數

文件及目錄操作 - file、md5sum

1. file:顯示文件的類型

file命令的功能說明

用於辨識文件類型。通過 file 指令,我們得以辨識該文件的類型。

file命令的語法格式

file [-bchiklLNnprsvz0] [--apple] [--mime-encoding] [--mime-type] [-e testname]
file [-bcLvz][-f <名稱文件>][-m <魔法數字文件>...][文件或目錄...]

file命令的選項說明

file 參數很多,表1為 file 命令的參數及說明:

表1: file命令的參數及說明

參數選項 解釋說明
-b  列出辨識結果時,不顯示文件名稱。
-c  詳細顯示指令執行過程,便於排錯或分析程序執行的情形。
-f<名稱文件>  指定名稱文件,其內容有一個或多個文件名稱時,讓file依序辨識這些文件,格式為每列一個文件名稱。
-L  直接顯示符號連接所指向的文件的類別。
-m<魔法數字文件>  指定魔法數字文件。
-v  顯示版本信息。
-z  嘗試去解讀壓縮文件的內容。
  • [文件或目錄...] 要確定類型的文件列表,多個文件之間使用空格分開,可以使用shell通配符匹配多個文件。

file命令的實踐操作

範例1: 顯示文件類型:

[[email protected] /test]# file /test/
/test/: directory

--------------------------------------------------------------
==>不顯示文件名稱<==
--------------------------------------------------------------
[[email protected] /test]# file -b /test/      
directory

--------------------------------------------------------------
==>顯示MIME類別<==
--------------------------------------------------------------
[[email protected] /test]# file -i /test/   
/test/: inode/directory; charset=binary

[[email protected] /test]# file -b -i /test/
inode/directory; charset=binary
[[email protected] /test]# 

範例2:顯示符號鏈接的文件類型

--------------------------------------------------------------
==>創建一個軟連接文件<==
--------------------------------------------------------------
[[email protected] /test]# touch oldboy.txt
[[email protected] /test]# ln -s oldboy.txt oldboy_soft_link

--------------------------------------------------------------
==>查看的結果<==
--------------------------------------------------------------
[[email protected] /test]# file oldboy_soft_link 
oldboy_soft_link: symbolic link to `oldboy.txt‘
[[email protected] /test]# ll oldboy_soft_link
lrwxrwxrwx 1 root root 10 4月  13 10:57 oldboy_soft_link -> oldboy.txt
[[email protected] /test]# file -L oldboy_soft_link
oldboy_soft_link: empty

--------------------------------------------------------------
==>empty是空的意思,內面沒有內容<==
--------------------------------------------------------------
[[email protected] /test]# file oldboy.txt 
oldboy.txt: empty
[[email protected] /test]# file -L oldboy.txt 
oldboy.txt: empty

--------------------------------------------------------------
==>添加內容,再次查看<==
--------------------------------------------------------------
[[email protected] /test]# echo "I love linux"  > oldboy.txt
[[email protected] /test]# cat oldboy.txt 
I love linux
[[email protected] /test]# file oldboy.txt
oldboy.txt: ASCII text
[[email protected] /test]# file -L oldboy.txt
oldboy.txt: ASCII text

2. md5sum:md5校驗

md5sum命令的功能說明

在網絡傳輸、設備之間轉存、復制大文件等時,可能會出現傳輸前後數據不一致的情況。這種情況在網絡這種相對更不穩定的環境中,容易出現。那麽校驗文件的完整性,也是勢在必行的。md5sum命令用於生成和校驗文件的md5值。它會逐位對文件的內容進行校驗。是文件的內容,與文件名無關,也就是文件內容相同,其md5值相同。md5值是一個128位的二進制數據,轉換成16進制則是32(128/4)位的進制值。md5校驗,有很小的概率不同的文件生成的md5可能相同。比md5更安全的校驗算法還有SHA*系列的。在網絡傳輸時,我們校驗源文件獲得其md5sum,傳輸完畢後,校驗其目標文件,並對比如果源文件和目標文件md5 一致的話,則表示文件傳輸無異常。否則說明文件在傳輸過程中未正確傳輸。

md5sum命令的語法格式

md5sum [OPTION]... [FILE]...
md5sum [參數] [文件]

md5sum命令的選項說明

md5sum 參數不常用,表1為 md5sum 命令的參數及說明:

表1: md5sum命令的參數及說明

參數選項 解釋說明
-b 以二進制模式讀入文件內容
-t 以文本模式讀入文件內容
-c 根據已生成的md5值,對現存文件進行校驗
--status 校驗完成後,不生成錯誤或正確的提示信息,可以通過命令的返回值來判斷。

md5sum命令的實踐操作

範例1: 不加參數,直接生成文件md5值(md5sum file

--------------------------------------------------------------
==>直接生成文件md5值<==
--------------------------------------------------------------
[[email protected] /test]# md5sum oldboy.txt 
d41d8cd98f00b204e9800998ecf8427e  oldboy.txt

--------------------------------------------------------------
==>往文本裏寫內容<==
--------------------------------------------------------------
[[email protected] /test]# echo "I love linux"  > oldboy.txt

--------------------------------------------------------------
==>md5值發生了變化<==
--------------------------------------------------------------
[[email protected] /test]# md5sum oldboy.txt 
553430bbfd91aca9db36ae6addccd06c  oldboy.txt

md5sum校驗的是文件內容,與文件名無關

範例2: 以文本模式或二進制模式讀入文件並對其進行校驗

[[email protected] /test]# file oldboy.txt
oldboy.txt: ASCII text
[[email protected] /test]# md5sum oldboy.txt
553430bbfd91aca9db36ae6addccd06c  oldboy.txt
[[email protected] /test]# md5sum -b oldboy.txt
553430bbfd91aca9db36ae6addccd06c *oldboy.txt
[[email protected] /test]# md5sum -t oldboy.txt
553430bbfd91aca9db36ae6addccd06c  oldboy.txt

雖然是不同的讀入模式,但是在進行求md5的時候,是一樣的,因為是逐位校驗的。

範例3: md5值重定向(可以留著做校驗而用的)

 [[email protected] /test]# md5sum oldboy.txt > oldboy.md5
[[email protected] /test]# md5sum oldboy.txt
553430bbfd91aca9db36ae6addccd06c  oldboy.txt
[[email protected] /test]# cat oldboy.md5 
553430bbfd91aca9db36ae6addccd06c  oldboy.txt

範例3: md5校驗,(-c參數)如果一致,則返回OK,否則返回錯誤信息

--------------------------------------------------------------
==>-c參數校驗<==
--------------------------------------------------------------
[[email protected] /test]# md5sum -c oldboy.md5 
oldboy.txt: 確定

--------------------------------------------------------------
==>往oldboy.txt裏追加內容<==
--------------------------------------------------------------
[[email protected] /test]# echo "Me too" >> oldboy.txt 
[[email protected] /test]# cat oldboy.txt 
I love linux
Me too

--------------------------------------------------------------
==>失敗<==
--------------------------------------------------------------
[[email protected] /test]# md5sum -c oldboy.md5 
oldboy.txt: 失敗
md5sum: 警告:1 個校驗和不匹配

範例4: 不顯示校驗信息,(--status參數)以命令返回值來判斷,校驗一致返回0,不一致返回1

--------------------------------------------------------------
==>不一致返回1<==
--------------------------------------------------------------
[[email protected] /test]# md5sum -c oldboy.md5 
oldboy.txt: 失敗
md5sum: 警告:1 個校驗和不匹配
[[email protected] /test]# md5sum -c --status  oldboy.md5 
[[email protected] /test]# echo $?
1

--------------------------------------------------------------
==>校驗一致返回1<==
--------------------------------------------------------------
[[email protected] /test]# md5sum oldboy.txt > oldboy.md5 
[[email protected] /test]# md5sum -c oldboy.md5 
oldboy.txt: 確定
[[email protected] /test]# md5sum -c --status  oldboy.md5 
[[email protected] /test]# echo $?
0

特殊說明
1)md5sum 是校驗文件內容,與文件名是否相同無關
2)md5sum值逐位校驗,所以文件越大,校驗時間越長。

總結
通過md5sum來校驗生成文件校驗碼,來發現文件傳輸(網絡傳輸、復制、本地不同設備間的傳輸)異常造成的文件內容不一致的情況。

工作實踐應用場景:
需要比較2個rc1.tar.gz 包和rc2.tar.gz兩個包,變更是不是和開發說的一致

  1. 獲取包,確保包正確無誤
    獲取包後,驗證包的MD5值:md5sum rc*.tar.gz
  2. 解壓縮到指定目錄
    確保對應的目錄存在
tar -zxvf  rc1.tar.gz -C ./test_rc1
tar -zxvf  rc2.tar.gz -C ./test_rc2
  1. 遞歸生成各文件的的MD5值
find ./test_rc1 -type f -print0| xargs -0 md5sum >> rc1_md5.txt
find ./test_rc2 -type f -print0| xargs -0 md5sum >> rc2_md5.txt
  1. 比較兩文件的MD5值
diff -c rc1_md5.txt  rc2_md5.txt

或者用UltraCompare Professional比對結果

今天就寫到這裏,有什麽疑問或出現什麽錯誤,隨時歡迎大神們發表評論指點迷津

Shell命令-文件及目錄操作之file、md5sum