tar ファイル内のハッシュ ファイル

tar ファイル内のハッシュ ファイル

内容が似ている2 つのファイルがあります*.tar。どのファイルが同一であるかを確認したいのですが、ファイルの多くは大きいため、ハッシュを比較するには、各 tar からすべてのファイルを抽出してハッシュを計算する必要があります。tar 内のファイルを抽出せずにハッシュする方法はありますか? 2 つの*.tarファイル間でファイルを比較する別の方法はありますか?

答え1

GNU tar の場合は、これを実行します。

tar -xf file1.tar --to-command=file-stats-from-tar

ここで、file-stats-from-tar は、次の場所にあり$PATHます。

#!/bin/bash

md5=`md5sum`;
md5=${md5%% *}

printf "%s\t%s\n" $md5 "$TAR_FILENAME"

md5sum必要であれば変更してください。

これにより、すべてが 1 回のパスで実行されます。

仕組みは、この--to-commandオプションがtarに送信するように指示する。それぞれ指定したコマンドとは別に、環境変数が多数設定されたファイルを作成します (TAR_FILENAMEここでは使用しません)。

答え2

もっと効率的な方法があるかもしれませんが、私は数分でこれを思いつきました:

tar tf test.tar | while read x ; do echo "$(tar xfO test.tar ${x} | md5sum) ${x}" ; done

最初のものtar tfはアーカイブ内のファイルをリストし、それがwhile read xbash ループに渡されます。各ファイル名について、 を使用してハッシュを検索します。tar xfO test.tar ${x} | md5sumもちろん、md5sum を好みのハッシュ ツールに置き換えることができます。 の奇妙な使用法は、echo $() ${x}左側に値、右側にファイル名がある通常のハッシュ出力に似た出力を維持するためです。これがないと、すべてのファイルのハッシュが表示されますが、名前は表示されないため、どのファイルがどのファイルに送られたかわかりません。これを使用しても、-通常は存在しない の列が出力に追加されます。これは、パイプラインのコマンドを使用して簡単に削除できますcolrm

tar ファイルに n 個のファイルがある場合、その tar ファイルを n+1 回読み取る必要があるため、これは最も効率的ではない可能性がありますが、最初の読み取り後に tar の内容がキャッシュされることが期待されます。

関連情報