我有兩個*.tar
內容相似的文件。我想驗證哪些文件是相同的。很多檔案很大,因此我比較雜湊值需要從每個 tar 中提取每個檔案並計算雜湊值。有沒有一種方法可以在不需要解壓縮的情況下對 tar 中的檔案進行雜湊處理?還有另一種方法可以比較兩個*.tar
文件之間的文件嗎?
答案1
如果是 GNU tar,請執行以下命令:
tar -xf file1.tar --to-command=file-stats-from-tar
其中 file-stats-from-tar 位於以下位置$PATH
:
#!/bin/bash
md5=`md5sum`;
md5=${md5%% *}
printf "%s\t%s\n" $md5 "$TAR_FILENAME"
md5sum
如果需要,請更改。
這一切只需一次即可完成。
它的工作原理是該--to-command
選項告訴 tar 發送每個文件單獨到您指定的命令,並設定了一堆環境變數(我們僅TAR_FILENAME
在此處使用)。
答案2
可能有更有效的方法,但我很快就想出了這個:
tar tf test.tar | while read x ; do echo "$(tar xfO test.tar ${x} | md5sum) ${x}" ; done
第一個tar tf
僅列出存檔中的文件,然後將其傳遞到while read x
bash 循環。對於每個檔案名,它會使用tar xfO test.tar ${x} | md5sum
您顯然可以用您首選的哈希工具替換 md5sum 來查找哈希值。奇怪的用法echo $() ${x}
只是保持輸出類似於常規哈希輸出,其中值在左側,檔案名稱在右側。如果沒有它,它只會為您提供所有檔案的雜湊值,但不會提供名稱,因此您無法分辨哪個檔案去了哪個檔案。即使有了它-
,輸出中也會有一個通常不存在的額外列。可以使用colrm
管道中的命令輕鬆刪除它。
這可能不是最有效的,因為如果 tar 檔案中有 n 個文件,它必須遍歷 tar 檔案 n+1 次,但希望 tar 內容在第一次讀取後被快取。