Files

壓縮兩個相同的文件夾會產生不同的結果

  • January 25, 2021

我有兩個相同的文件夾,具有相同的結構和內容,如下所示:

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

當然,如果我md5sumsha1sum他們我會得到兩個不同的雜湊值

這就是我的問題…我需要檢查提供的存檔是否與我儲存中的存檔相同。我不能使用散列,也不能只檢查文件大小。

使用 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 -

您可能對Debian wiki page on reproducible builds感興趣。

引用自:https://unix.stackexchange.com/questions/346789