2015-03-03 69 views
1

說我有兩個文件,foobar。如果我想驗證他們有相同的內容,我可以運行:Shell命令,以確定文件`foo`是文件的截斷`bar`

diff -q foo bar 

並檢查退出代碼爲零。同樣,我可以爲具有不同內容的文件執行相同的操作,並查找非零退出狀態。

現在,假設在我們的例子文件foo是500個字節,文件bar是幾兆 - 但第500個字節的bar等同於整個文件foo。是否有一個簡單的命令來驗證這種情況,最好不解析大差異的輸出?

它會改變什麼,如果文件是二進制,而不是文本?

回答

6

cmp似乎更快,此製成:

cmp -n $(stat -c %s file1) file1 file2 

$(stat -c %s file1)file1大小,cmp -n 123 file1 file2比較第一123個字節的file1file2

+0

這只是完美的。儘管在OS X上,獲取文件大小需要調整爲像'stat -f%z'這樣的東西。不過,似乎很好。 – smitelli 2015-03-03 19:29:41

1

我想你可以使用split來獲取文件,其中N是較小的文件長度的前N個字節,然後diff那些:

split -b "$(wc -c < foo)" bar out 
diff -q foo outaa 

由於smitelli點出的意見,之後必須清理由split生成的文件。你可以使用像rm out??這樣做(我的系統中後綴的默認長度是2個字符)。

+0

應當注意的是,如果'bar'比'foo'顯著較大,拆分將傾達676'出* '文件放入工作目錄中,之後必須清理。 – smitelli 2015-03-03 19:34:04

+0

@smitelli好點,編輯。 – 2015-03-03 19:46:49

0

我想我們可以在這裏使用cmp命令。它只是檢查第一個不匹配和下面提供retrun狀態,

 0  Files are identical. 
     1  Files are not identical. 
     2  Inaccessible or missing argument. 

在烏拉圭回合的情況下,它給出了消息「CMP:於foo EOF」,並返回1. 它比diff的

0

您可以通過read文件逐字節,是這樣的:

while read -n 1 -u 7 byte; do 
     read -n 1 -u 6 bite 
     if [ "$byte" != "$bite" ]; then 
      echo "Not a subset" 
      break 
     fi 
done 6<big_file 7<small_file 
+0

對文件描述符選擇「6」和「7」有什麼意義? – smitelli 2015-03-03 19:40:17

+0

@smitelli沒有什麼好! – 2015-03-04 10:29:29