Tarは毎回異なるファイルを生成します。

Tarは毎回異なるファイルを生成します。

私はしばしばサーバーからローカルコンピュータに転送したい大きなディレクトリを持っています。私は通常、再帰scprsyncディレクトリ自体を使用するのではなく、最初にディレクトリを使用してからそれを送信します。targzip

最近これが実際に機能していることを確認したいので、同じソースディレクトリから独立して作成された2つのアーカイブtarに対してmd5sumを実行しました。gzip驚くべきことに、MD5ハッシュは異なります。これをもう一度やりましたが、いつも新しい価値でした。なぜこの結果が表示されますか?同じバージョンのGNU tarを使用して、tarとgzippedディレクトリはまったく同じ方法で作成されますか?同じでなければなりませんか?

わかりやすくするために、ソースディレクトリとターゲットディレクトリがあります。ターゲットディレクトリにはdir1とdir2があります。私は走っています:

tar -zcvf /destination/dir1/source.tar.gz source && md5sum /destination/dir1/source.tar.gz >> md5.txt

tar -zcvf /destination/dir2/source.tar.gz source && md5sum /destination/dir2/source.tar.gz >> md5.txt

これを行うたびに、md5sumに別の結果が表示されます。 Tarはエラーや警告を生成しません。

答え1

見たらあなたが噛まれたようですね。gzipタイムスタンプ; これを防ぐには、次の手順を実行します。

GZIP=-n tar -zcvf ...

完全に再現可能なタールボールを入手するには、以下も適用する必要があります。ソート順の使用tar:

GZIP=-n tar --sort=name -zcvf ...

tarあなたのバージョンがそれをサポートしていない場合は、--sort代わりに以下を使用してください。

find source -print0 | LC_ALL=C sort -z | GZIP=-n tar --no-recursion --null -T - -zcvf ...

答え2

Macでは@stephen-kittの答えがうまくいかず、理由はわかりませんでしたが、gzipをtarコマンドから切り離すと同じハッシュが生成され始めました。これが私が終わるものです:

outputpath="$(pwd)/folder_to_zip" 
find "$outputpath" -print0 | LC_ALL=C sort -z | tar -s "#$outputpath/##" --no-recursion --null -T - -cf - | gzip -n > "$outputpath.tar.gz" && md5 "$outputpath.tar.gz"

関連情報