web-dev-qa-db-ja.com

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

サーバーからローカルコンピュータに転送したい大きなディレクトリがよくあります。ディレクトリ自体で再帰的なscpまたはrsyncを使用する代わりに、最初にtargzipを使用してから転送することがよくあります。

最近、これが実際に機能していることを確認したいので、同じソースディレクトリの2つの独立して生成されたtarおよびgzipアーカイブに対してmd5sumを実行しました。驚いたことに、MD5ハッシュは異なっていました。私はこれをさらに2回行い、それは常に新しい値でした。この結果が表示されるのはなぜですか? GNU tarの同じバージョンで2つの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はエラーや警告を生成しません。

6
Alon Gelber

あなたがおそらく噛まれているものの外観から gzip timestamps ;それらを回避するには、実行します

GZIP=-n tar -zcvf ...

完全に再現可能なtarballを取得するには、 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 ...
8
Stephen Kitt

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"
1
VFein