web-dev-qa-db-ja.com

diffは2つのファイルが同じであるにもかかわらず異なると報告します!

私には同じように見える2つのファイル(末尾の空白と改行を含む)がありますが、diffはまだそれらが異なると言っています。 diff -y並べて比較すると、行はまったく同じに見えます。 diffからの出力は2つのファイル全体です。

何が原因なのでしょうか?

34
MinaHany

奇妙な.. cmpを試せますか? '-b 'オプションも。

cmp man page -2つのファイルをバイト単位で比較します。

これはUnix/Linuxのいいところの1つです。

29
Levon

試してください:

diff file1 file2 | cat -t

-tオプションを指定すると、catに特殊文字が明確に表示されます。 ^M CRの場合、^Iタブ。

Manページ(OS X)から:

 -t      Display non-printing characters (see the -v option), and display tab characters as `^I'.

 -v      Display non-printing characters so they are visible.
         Control characters print as `^X' for control-X; the delete character
         (octal 0177) prints as `^?'.  Non-ASCII characters
         (with the high bit set) are printed as `M-' (for meta) followed by the
         character for the low 7 bits.
17
JosephH

違いは、DOSとUNIXの行末、または同様の何かによって引き起こされるのでしょうか?

あなたがそれらをhexdumpした場合はどうなりますか?これにより、より明確に違いが示される場合があります。例:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
17
mrb

確認されたことが判明した私の最初の推測は、ファイルが異なる行末を使用していることです。これは、末尾の空白の存在(ただし、通常は多くの行でそれが得られない)または異なるインデント(タブとスペース)など、空白のその他の違いである可能性があります。次のように、空白と制御文字を表示形式で出力するコマンドを使用します。

diff <(cat -A file1) <(cat -A file2)
diff <(sed -n l file1) <(sed -n l file2)

最初に正規化することで、違いが行末のみに関係していることを確認できます。 dos2unixユーティリティ;そうでない場合は、余分なCR(^ M、\ r、\ 015)文字を明示的に削除します。

diff <(tr -d '\r' <file1) <(tr -d '\r' <file2)

または、file1はDOSで終わるものです

 tr -d '\r' <file1 | diff - file2