2012-02-14 19 views
1

同じファイルの80個のコピーのmd5sumsをお互いに比較し、不一致で失敗を報告する必要があります。どのようにしてbashで効果的にやりますか?私はそれを行うためのエレガントなアルゴリズムを探しています。bashで80個のmd5sumをどのように比較するのですか

+1

これらのファイルはすべて同一であると想定されていますが、そうでないファイルはどれですか? –

答えて

0
md5sum FILES > MD5SUMS.md5 
cut -c1-32 < MD5SUMS.md5 | sort | uniq -c | sort -n 

戻りますこのようなもの:

1 485fd876eef8e941fcd6fc19643e5e59 
    1 585fd876eef8e941fcd6fc19643e5e59 
    5 385fd876eef8e941fcd6fc19643e5e59 

読む:5 fi lesには同じチェックサムがあり、他の2つには "個別の"チェックサムがあります。私は、大多数が正しいと考えているので、追加します。

| tail -1 | cut -c 9- 

最後の行のチェックサムを返します。

md5sum FILES > MD5SUMS.md5 
grep -v "$(cut -c1-32 < MD5SUMS.md5 | sort | uniq -c | sort -n | tail -1 | cut -c 9-)" MD5SUMS.md5 | cut -c35- 

これで、非多数ファイルのファイル名が出力されます。

3
md5sum FILES | sed 's/ .*$//' | sort -u 

複数の出力行がある場合は、不一致があります。

(不一致がある場合これはあなたを教えてくれません。)

が一緒にそれを置く、とやや少ない簡潔awkコマンドでsedコマンドを置き換える:

count=$(md5sum "[email protected]" | awk '{print $1}' | sort -u | wc -l) 
if [ $count -eq 1 ] ; then 
    echo "Everything matches" 
else 
    echo "Nope" 
fi 
+0

'sedの/。* $ // ''は暗号化されていない 'cut -d' '-f1'だが+1である。 –

+0

またはそれほど暗い: 'awk '{print $ 1}' –

+0

私は、異なる金額のファイルを識別する大きなソリューションに取り組んでいましたが、あなたの1つのライナーに対して膨大な量の余分な仕事をする価値はないでしょう。あなたはいつも "md5sum FILES | grep BADSUM"の後ろにあるファイルを見つけることができます。 –

0

の出力:

md5sum $files | sort -k 1,2 

は、その後、対応するファイル名でソートされた順序でチェックサムの一覧です。結果に目を向ける必要がある場合は、これで十分でしょう。奇妙なボールの結果を特定する必要がある場合は、プレゼンテーションを決定する必要があります。あなたは80枚の「同じファイル」を持っていると言います。実際には、8つのバージョンの「ファイル」のそれぞれが10個ずつコピーされているとします。どのようにして正しいか、どちらが偽であるかをどうやって決めようとしていますか? 1つのハッシュで41、もう1つで39の場合はどうなりますか?39が間違っていて41が正しいことは確かですか?明らかに、1つのハッシュが支配的になる可能性が高いですが、それらの厄介な境界条件については心配する必要があります。

またのような手の込んだもの、行うことができます。これはあなたのMD5チェックサム、繰り返し回数、およびファイル名からなる出力を与える

md5sum $files | sort -k 1,2 > sorted.md5 
sed 's/ .*//' sorted.md5 | uniq -c | sed 's/^ *\([0-9][0-9]*\) \(.*\)/\2 \1/' > counted.md5 
join -j 1 -o 1.1,2.2,1.2 sorted.md5 counted.md5 

を。必要に応じて、最初のsedスクリプトをawk '{print $1}'に置き換えることができます。 2番目の数字はawk '{printf "%s %s\n", $2, $1}'で置き換えられます(これはおそらくより明確です)。です。その理由は、の出力の先行スペースを取り除くことで、joinを混乱させるからです。

md5sum $files | sort -k 1,2 > sorted.md5 
awk '{print $1}' sorted.md5 | uniq -c | awk '{printf "%s %s\n", $2, $1}' > counted.md5 
join -j 1 -o 1.1,2.2,1.2 sorted.md5 counted.md5 

私はdbatools.hをコピーして、いくつかのファイルのx1.h、x2.hとx3.hを作成し、files=$(ls *.h)を設定します。出力した:

0763af91756ef24f3d8f61131eb8f8f2 1 dblbac.h 
10215826449a3e0f967a4c436923cffa 1 dbatool.h 
37f48869409c2b0554d83bd86034c9bf 4 dbatools.h 
37f48869409c2b0554d83bd86034c9bf 4 x1.h 
37f48869409c2b0554d83bd86034c9bf 4 x2.h 
37f48869409c2b0554d83bd86034c9bf 4 x3.h 
5a48695c6b8673373d30f779ccd3a3c2 1 dbxglob.h 
7b22f7e2373422864841ae880aad056d 1 dbstringlist.h 
a5b8b19715f99c7998c4519cd67f0230 1 dbimglob.h 
f9ef785a2340c7903b8e1ae4386df211 1 dbmach11.h 

これは、さらに必要に応じて処理することができます(逸脱ファイルが最後に表示されるので、例えば、sort -k2,3nrで、降順にカウントを取得します)。一緒にグループ化された重複ファイルの名前と、各重複がいくつあるかを示すカウントがあります。あなたが次にすることは、あなたに依存します。

実際の制作スクリプトでは、もちろんハードコードされた名前の代わりに一時ファイル名が使用され、それ自体は後でクリーンアップされます。

関連する問題