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

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

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



답변

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

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

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


답변

DOS 대 UNIX 줄 끝 또는 이와 유사한 것 때문에 차이점이있을 수 있습니까?

당신이 hexdump그들을 어떻게하면 ? 다음과 같은 차이점이 더 분명하게 나타날 수 있습니다.

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


답변

시험:

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.

답변

확인 된 것으로 밝혀진 첫 번째 추측은 파일이 다른 줄 끝을 사용한다는 것입니다. 공백 뒤에 다른 공백이있을 수 있습니다 (예 : 후행 공백이 있지만 일반적으로 여러 줄에 표시되지 않음) 또는 들여 쓰기가 다릅니다 (탭 대 공백). 공백을 인쇄하고 다음과 같은 문자를 보이는 형태로 제어하는 ​​명령을 사용하십시오.

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


답변