わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

2つのファイルの中身は同じ? 違う?

いきなりですが問題です.

2つのファイルをダウンロードし,「A」と「B」という名前で保存しました.
これらの内容が同じか違うかを,手っ取り早く判断するには,どうすればいいでしょうか?

Linuxコマンドラインを使うことにしましょう.
まずはファイルサイズを比べます.lsコマンドに,-lオプションをつけて実行すれば(ls -l A B),各ファイルのバイト数が表示されます.

2つとも,422435と分かりました.
次に中身を比べます.1バイトずつ,値が同じかどうかをチェックするプログラムを作るのは面倒なので,かわりに,ハッシュ値で比べることにしましょう.ハッシュ関数アルゴリズムとしては,MD5SHA-1,SHA-256などが候補になります.
「sha」まで打ち込んでから,Tabキーを2回,押すと,候補が現れます.

続けて「1」を打ち込んで,Tabキーを押すと,「sha1」から始まるコマンド名は「sha1sum」のみなので,このコマンド名が表示されます.「補完」の機能で,コマンド名だけでなく,ディレクトリ名やファイル名の指定にも便利です.
sha1sumコマンドは複数のファイル名を引数にとり,読み出して,中身のハッシュ値を16進表記で出力してくれます.それではsha1sum A Bを実行して,ハッシュ値を求めましょう.

ハッシュ値は,同じでした.なので,内容が同じという可能性があります.
他のハッシュアルゴリズムを試しましょう.sha256sum A BでSHA-256,md5sum A BMD5の,ハッシュ値を求めます.

SHA-256や,MD5では,ハッシュ値がそれぞれ異なっています.ですので,今回試した2つのファイルでは,AとBの内容は違うというのが,結論になります.
一般的な手順を整理します.まずls -lでファイルサイズを比較し,異なっていればもちろん内容は違うと言えます.
同じであれば,複数のハッシュアルゴリズムで,出力(ハッシュ値)を見比べればいいのです.
あるアルゴリズム(コマンド)で,ハッシュ値が異なっていれば,違いますし,どんなアルゴリズム(コマンド)でも,ハッシュ値が同じであれば,同一内容の可能性が高くなります.
上の実行例で,sha1sumコマンドによるハッシュ値が同じになりましたが,これは今年2月,"SHAttered"として提示された,SHA-1での衝突(中身は違うがハッシュ値は同じ)のファイルです.http://qiita.com/rana_kualu/items/53368eeec521013f0c11の「PDF1」「PDF2」をダウンロードし,それぞれファイル名を「A」「B」に変えていました.
なのですが,同一ディレクトリ(またはファイルシステム上)にある2つのファイルであれば,diffコマンドのほうが効率的です.内容が一致しているか否かの判定には,-qオプションを指定します.実行するコマンドは,diff -q A Bです.

用途に応じてコマンドを使い分け,悔しいLinuxライフを過ごしましょう.