内容が似ている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 x
bash ループに渡されます。各ファイル名について、 を使用してハッシュを検索します。tar xfO test.tar ${x} | md5sum
もちろん、md5sum を好みのハッシュ ツールに置き換えることができます。 の奇妙な使用法は、echo $() ${x}
左側に値、右側にファイル名がある通常のハッシュ出力に似た出力を維持するためです。これがないと、すべてのファイルのハッシュが表示されますが、名前は表示されないため、どのファイルがどのファイルに送られたかわかりません。これを使用しても、-
通常は存在しない の列が出力に追加されます。これは、パイプラインのコマンドを使用して簡単に削除できますcolrm
。
tar ファイルに n 個のファイルがある場合、その tar ファイルを n+1 回読み取る必要があるため、これは最も効率的ではない可能性がありますが、最初の読み取り後に tar の内容がキャッシュされることが期待されます。