Files
壓縮兩個相同的文件夾會產生不同的結果
我有兩個相同的文件夾,具有相同的結構和內容,如下所示:
folder_1 hello.txt subfolder byebye.txt folder_2 hello.txt subfolder byebye.txt
如果我將它們壓縮為 tar.xz 格式,我會得到兩個不同的檔案,它們具有兩種不同的文件大小(只有幾個字節,但它們並不相同)。
$ cd folder_1 && tar -Jcf archive.tar.xz * $ cd folder_2 && tar -Jcf archive.tar.xz *
我得到:
folder_1/archive.tar.xz != folder_2/archive.tar.xz
當然,如果我
md5sum
或sha1sum
他們我會得到兩個不同的雜湊值這就是我的問題…我需要檢查提供的存檔是否與我儲存中的存檔相同。我不能使用散列,也不能只檢查文件大小。
使用 zip 而不是 tar.xz 工作,因為 zip 總是從相同的文件產生相同的檔案。為什麼會這樣?有沒有辦法防止它?
好的,ddnomad給出的解釋是正確的。這是關於時間戳的。
這是解決方案:
添加
--mtime='1970-01-01 00:00:00'
到 tar 命令:tar --mtime='1970-01-01 00:00:00' -Jcf archive.tar.xz *
這將強制內容時間戳為固定值,從而產生相同的存檔。
同一目錄樹的兩個 tarball 可能不同的原因有很多。主要有:
所有權、時間戳等元數據可能不同。要獲得可重現的 tar 存檔,您需要擁有相同的所有權、權限和時間戳。確保您複製了所有元數據(如果您有相同的文件內容和不同的元數據,
cp -a --attributes-only
可能會有所幫助)。使用 GNU tar,您可以使用一些選項來忽略某些屬性:
--numeric-owner
僅儲存數字使用者和組 ID,而不儲存名稱。--owner
並--group
強制將文件分別記錄在某個使用者和組下(例如--owner=0 --group=0
將所有文件記錄為屬於root)。--set-mtime
允許您儲存具有特定時間戳而不是真實時間戳的所有文件。文件的儲存順序可能不同。大多數文件系統沒有對文件在目錄中列出的順序提供任何特定保證,而是在
tar
它們出現時列出它們。(您可以使用 來查看順序ls -U
。) GNU tar 1.28 有一個新選項--sort=name
。對於舊版本或其他實現,您可以通過建構文件名的排序列表並將其傳遞給 tar 來獲得可重現的文件順序:find . -print0 | LC_ALL=C sort -z | tar --no-recursion -Jcf ../archive.tar.xz -T -