2つの同じフォルダを圧縮すると、異なる結果が発生します。

2つの同じフォルダを圧縮すると、異なる結果が発生します。

次のように同じ構造と内容を持つ2つの同じフォルダがあります。

folder_1
  hello.txt
  subfolder
    byebye.txt

folder_2
  hello.txt
  subfolder
    byebye.txt

tar.xz形式に圧縮すると、ファイルサイズが異なる2つの異なるアーカイブが作成されます(わずか数バイトしかありませんが、同じではありません)。

$ 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

もちろん、私や彼らは、md5sum2sha1sumつの異なるハッシュを取得します。

私の問題は次のとおりです。提供されたアーカイブが私のリポジトリのアーカイブと同じであることを確認する必要があります。ハッシュは利用できず、ファイルサイズのみを確認することはできません。

tar.xzの代わりにzipを使用すると、zipは常に同じファイルから同じアーカイブを生成するため、問題はありません。なぜこれが起こるのですか?それを防ぐ方法はありますか?

答え1

さて、ddnomadによって提供された説明は正しいです。タイムスタンプについてです。

解決策は次のとおりです。

--mtime='1970-01-01 00:00:00'tar コマンドに追加:

tar --mtime='1970-01-01 00:00:00' -Jcf archive.tar.xz *

これにより、コンテンツタイムスタンプが固定値に強制され、同じアーカイブが作成されます。

答え2

同じディレクトリツリーの2つのタールボールが異なる理由はいくつかあります。以下があります:

  • 所有権、タイムスタンプなどのメタデータは異なる場合があります。コピー可能なtarアーカイブを取得するには、同じ所有権、権限、およびタイムスタンプが必要です。すべてのメタデータをコピーしたことを確認してください。ファイルの内容は同じで、メタデータは異なる場合にcp -a --attributes-only役立ちます。 GNU tar では、いくつかのオプションを使用して特定の属性を上書きできます。

    • --numeric-owner名前は保存されず、数字のユーザーとグループIDのみが保存されます。
    • --ownerそして、--groupファイルが特定のユーザーとグループにそれぞれ書き込まれるように強制します(たとえば、--owner=0 --group=0すべてのファイルをルートに属するものとして記録します)。
    • --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ページ

答え3

すべてのファイル(フォルダもファイルです)にはタイムスタンプが組み込まれています。

これらのフォルダ構造を同時に作成することはできないと思うので、これらのファイルのタイムスタンプは異なります。

したがって、アーカイブまたはハッシュは、タイムスタンプが両方のジョブで使用されるファイルの一部であるため、異なる結果を提供します。

これは、見かけ上同じように見えるファイル構造の違いです。

更新:同様の内容があることを確認したら、実際にこれらのファイルの内容を確認して比較する必要があるようです。

関連情報