サーバーからローカルコンピュータに転送したい大きなディレクトリがよくあります。ディレクトリ自体で再帰的なscp
またはrsync
を使用する代わりに、最初にtar
とgzip
を使用してから転送することがよくあります。
最近、これが実際に機能していることを確認したいので、同じソースディレクトリの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はエラーや警告を生成しません。
あなたがおそらく噛まれているものの外観から 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 ...
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"