私はしばしばサーバーからローカルコンピュータに転送したい大きなディレクトリを持っています。私は通常、再帰scp
やrsync
ディレクトリ自体を使用するのではなく、最初にディレクトリを使用してからそれを送信します。tar
gzip
最近これが実際に機能していることを確認したいので、同じソースディレクトリから独立して作成された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"