web-dev-qa-db-ja.com

複数のmd5チェックサムを含む2つのファイルを比較して、変更されたファイルを判断するにはどうすればよいですか?

MD1MD2の2つのファイルがあります。

MD1にはmd5sumが含まれます。

5f31caf675f2542a971582442a6625f6  /root/md5filescreator/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30  /root/md5filescreator/hash2.txt
1364cdba38ec62d7b711319ff60dea01  /root/md5filescreator/hash3.txt

ここで、hash1hash2、およびhash3は、フォルダーmd5filescreatorにある3つのファイルです。

同様に、MD2には以下が含まれます。

163559001ec29c4bbbbe96344373760a  /root/md5filescreators/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30  /root/md5filescreators/hash2.txt
1364cdba38ec62d7b711319ff60dea01  /root/md5filescreators/hash3.txt

これらのファイルはmd5filescreatorsフォルダーにあります。

md5filescreatorのチェックサムを、md5filecreatorsの対応するファイルのチェックサムと比較したい。

シェルスクリプトは、同じチェックサムを持つファイルの場合はOKを、そうでないファイルの場合はFALSEをファイル名とともに返す必要があります。

これはmd5sum --checkを使用して実行できます(通常は1つのMD5ファイルのみの変更をチェックするため)。

6
swapedoc

これはmd5sum --check?を使用して実行できるかどうかを知りたい(通常は1つのMD5ファイルのみの変更をチェックするため)。

いいえ、できません。

md5sum --checkは、入力ファイルの2番目の列の各ファイルへのパスを読み取り、最初の列で報告されたチェックサムに対してMD5チェックサムを再度チェックするためのものです。 2つのファイルのチェックサムを直接比較する場合は、テキストファイルを比較する必要があります。

paste + AWKを使用すると、次のことができます。

paste file1 file2 | awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}'
  • paste file1 file2file1の行Nでfile2の行Nに結合します。
  • awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}':最初のフィールドが3番目のフィールドと等しい場合(MD5の合計が一致する場合)、xに「OK」を割り当て、そうでない場合はxに「FALSE」を割り当て、2番目のフィールド(ファイル名)の後にxの値が続きます。
% cat file1
5f31caf675f2542a971582442a6625f6 /root/md5filescreator/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30 /root/md5filescreator/hash2.txt
1364cdba38ec62d7b711319ff60dea01 /root/md5filescreator/hash3.txt
% cat file2
163559001ec29c4bbbbe96344373760a /root/md5filescreators/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30 /root/md5filescreators/hash2.txt
1364cdba38ec62d7b711319ff60dea01 /root/md5filescreators/hash3.txt
% paste file1 file2 | awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}'
/root/md5filescreator/hash1.txt FALSE
/root/md5filescreator/hash2.txt OK
/root/md5filescreator/hash3.txt OK
5
kos

これを確認する簡単な方法は、両方のファイル間でどの行がnot複製されているかを確認することです。

sort file1 file2 | uniq --unique

uniq --uniqueは、再び現れていない行を出力します 。したがって、ハッシュが一致するファイルには重複した行が含まれ、出力には表示されません。出力が生成されたかどうかを簡単にテストするには、grepを使用します。

sort file1 file2 | uniq --unique | grep -q .

この場合、ディレクトリが異なるため、もう少し処理が必要です。

awk -F/ '{print $1, $NF}' | sort | uniq --unique | awk '!a[$2]++{print $2}'

または、完全にawkで:

awk -F/ 'FNR == NR {hash[$NF] = $1; next} hash[$NF] != $1 {print $NF}'

どちらの場合も、ハッシュが異なるファイル名のみを取得します。

2
muru