diffは、2つのファイルが異なることを報告しますが、それらは同じです!


31

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

何がそれを引き起こしているのでしょうか?


3
印刷できない文字を比較してみてください。それらを見る最も簡単な方法はsed -n l filenameです。それでも解決しない場合は、diffここにデータの例を追加して出力します。
ラッシュ

1
ああ、はい、ありがとう、ファイル内の行は$で終わり、もう1つは\ r $で
終わります-MinaHany

1
簡単な修正方法は、両方のファイル(またはWindowsマシンからのものと思われるファイル)でdos2unixを使用することです。
ケムブラッド

既存の答えを補完するものとして、fileコマンドはASCII text, with CRLF line terminatorsvsのようなものを含むファイルの内容についてあなたにヒントを与えますASCII text
ステファンゴーリコン

回答:


29

奇数..あなたは試すことができますcmpか?「-b」オプションも使用できます。

cmp manページ-2つのファイルをバイトごとに比較します。

これはUnix / Linuxの素晴らしい点の1つです。非常に多くのツール:)


2
それをありがとう!私は得ました:バイト19、行1は15 ^ M 12 ^ Jです
ミナハニー


2
diffで-bを試してみましたが、うまく機能しているようです。manページは述べている-bためですignore changes in the amount of white space
rahul.deshmukhpatil

17

DOSとUNIXの行末、または類似したものによって違いが生じる可能性がありますか?

もしあなたがhexdump彼らなら?これにより、より明確に違いが示される場合があります。例:

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

さて、2つのヘクスは異なります。ファイルに0d 0aがあるたびに、もう1つには0aがあります
-MinaHany

3
1つにはDOSの行末(CRLF)があり、もう1つにはUNIXの行末(LF)があります。そのため、diffとは異なるように見えますが、視覚的には違います。en.wikipedia.org/wiki/Newline#Conversion_utilities
mrb

とった!どうもありがとう。しかし、cmpを使用するというLevonの提案は、違いをより明確に示しています:)
MinaHany

17

試してください:

diff file1 file2 | cat -t

この-tオプションによりcat、特殊文字が明確に表示されます-例えば。^MCR、^Iタブ用。

マニュアルページから(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.

4

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

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)

または、file1DOSで終わる場合

 tr -d '\r' <file1 | diff - file2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.