diff는 두 파일이 동일하지만 서로 다르다고보고합니다!


31

나는 공백과 줄 바꿈을 포함하여 나와 동일하게 보이는 두 개의 파일을 가지고 있지만 diff는 여전히 다르다고 말합니다. 내가 할 경우에도 diff -y측면 비교 나란히 선은 정확히 같은 모양. diff의 출력은 전체 2 개의 파일입니다.

무엇이 원인인지 아십니까?


3
인쇄 할 수없는 문자를 비교하십시오. 그들을 보는 가장 간단한 방법은 sed -n l filename입니다. 도움이되지 않으면 데이터 예제를 추가하고 diff여기에 출력하십시오.
돌진

1
예, 감사합니다. 파일의 줄은 $로 끝나고 다른 줄은 \ r $로 끝납니다
MinaHany

1
빠른 수정은 두 파일 모두 (또는 Windows 시스템에서 온 것으로 의심되는 파일)에 dos2unix를 사용하는 것입니다.
chembrad

기존 답변을 보완하기 file위해이 명령은 ASCII text, with CRLF line terminatorsvs 와 같은 파일 내용에 대한 힌트를 제공합니다 ASCII text.
Stéphane Gourichon

답변:


29

이상한 .. 시도해 볼 수 cmp있습니까? ' -b'옵션도 사용할 수 있습니다 .

cmp man page- 두 파일을 바이트 단위로 비교합니다.

이것은 유닉스 / 리눅스에서 좋은 점 중 하나입니다. 너무 많은 도구 :)


2
고마워요! 바이트 19, 라인 1은 15 ^ M 12 ^ J입니다. 무슨 뜻입니까?
MinaHany


2
diff와 함께 -b를 시도했는데 그것은 나를 위해 일하는 것 같습니다. 매뉴얼 페이지는 -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

음, 두 헥스는 다릅니다. 파일에 0d 0a가있을 때마다 다른 하나는 0a를
갖습니다

3
하나에는 DOS 줄 끝 (CRLF)이 있고 다른 하나에는 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.