ファイルの内容が同じであれば同じアーカイブ ファイルが得られるように、いくつかのファイルを確定的にアーカイブする必要があります。これは、後でアーカイブ ファイルの等価性をテストするために必要です。
ただし、tar にはタイムスタンプ情報が含まれているため、ファイルの内容が同じであっても異なるアーカイブ ファイルが生成されます。
タイムスタンプ情報を含まないアーカイブ (tar、zip など) を作成するにはどうすればよいでしょうか?
注: 2 つの tar ファイルが異なる場合でも、タイムスタンプを無視して、tar --diff
やなどのツールを使用してコンテンツのみを比較できることはわかっていますtarsum
。ただし、比較に他の外部ツールを使用することはできません (設定のため)。2 つのアーカイブ ファイルが正確に等しいかどうかをテストすることしかできません。
注: ファイルをアーカイブする前に、すべてのファイルのタイムスタンプを特定の値に設定して、タイムスタンプを同じにすることができることはわかっています。ただし、ファイルの数が多いため、これを実行したくありません。タイムスタンプ情報なしでこれらのファイルをアーカイブしたいだけです。
例:
$ mkdir copy1
$ touch copy1/file1
$ touch copy1/file2
$ sleep 60
$ mkdir copy2
$ touch copy2/file1
$ touch copy2/file2
$ ls -l copy1
total 0
-rw-r--r-- 1 david wheel 0 Oct 27 00:59 file1
-rw-r--r-- 1 david wheel 0 Oct 27 00:59 file2
$ ls -l copy2
total 0
-rw-r--r-- 1 david wheel 0 Oct 27 01:00 file1
-rw-r--r-- 1 david wheel 0 Oct 27 01:00 file2
# the content of those files is the same; they only differ by the their timestamp
$ (cd copy1; tar -cvf ../copy1.tar .)
$ (cd copy2; tar -cvf ../copy2.tar .)
$ tar -tvf copy1.tar
drwxr-xr-x 0 david wheel 0 Oct 27 00:59 ./
-rw-r--r-- 0 david wheel 0 Oct 27 00:59 ./file1
-rw-r--r-- 0 david wheel 0 Oct 27 00:59 ./file2
$ tar -tvf copy2.tar
drwxr-xr-x 0 david wheel 0 Oct 27 01:00 ./
-rw-r--r-- 0 david wheel 0 Oct 27 01:00 ./file1
-rw-r--r-- 0 david wheel 0 Oct 27 01:00 ./file2
$ diff copy1.tar copy2.tar
Binary files copy1.tar and copy2.tar differ
zip -X
の代わりにを試してみましたtar
が、結果は同じでした
答え1
何らかの方法でタイムスタンプを完全に無効にしたとしても、すべてのケースで 100% の節約になるとは限りません。実際、ファイルの順序によって結果が変わる可能性があります (つまり、「tar cf a.tar file1 file2」は「tar cf b.tar file2 file1」とは異なりますが、仕様上は内容は同じであり、順序はファイルシステムに依存する可能性があります)。
あなたが言ったように、単なるファイル比較 (md5sum など) よりも、もっと明確な方法を実行する必要があると思います。
本当に単純なファイル比較だけを実行したいのであれば、次のようなファイル名ヘッダーを持つファイルを貼り付ける単純なシェルをお勧めします。
for i in file1 file2; do echo "$i"; cat $i; done;
もちろん、必要に応じて gzip で圧縮することもできます。その際、常に順序を維持するように注意してください。
答え2
Zipアーカイブの内容を比較するには、オープンソースのcomp_zipツールを使用できます@https://sourceforge.net/projects/unzip-ada/またはhttps://github.com/zertovitch/zip-ada/。
コマンドは ですcomp_zip file1.zip file2.zip
。詳細度を指定するスイッチがあります。
答え3
--mtime
明示的なタイムスタンプを設定するには、オプションを使用できます。
$ tar --help
...
Handling of file attributes:
...
--mtime=DATE-OR-FILE set mtime for added files from DATE-OR-FILE
...
$ tar --version
tar (GNU tar) 1.29
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by John Gilmore and Jay Fenlason.