개행 없이 파일의 "diff"

개행 없이 파일의 "diff"

ASCII가 아니고 개행 문자가 없는 파일을 비교해야 합니다. 이상적으로는 무엇이 추가되었는지, 무엇이 제거되었는지, 무엇이 수정되었는지, 어쩌면 다른 파일과 다른 비율(백분율, 크기)이 있는지 확인하고 싶습니다.

문제는 diff삭제/추가된 줄에 대해서만 알려주는 것 같은데, 내 경우에는 누가 문제인지 알려주는 것 같습니다. ASCII가 아닌 파일에서는 제대로 작동하지 않는 것 같습니다. 해당 파일을 ASCII로 표시하려고 하므로 관련 데이터가 표시되지 않습니다.

답변1

diff텍스트 파일에만 적용됩니다. 바이너리 파일에 대해 diff를 실행하려면 먼저 xxd또는 를 사용하여 해당 파일을 텍스트로 변환해야 합니다 hexdump. 즉석에서 하면 쉽습니다프로세스 교체.

예를 들어

$ cat file1
A B C D E

$ cat file2
A B X D E

$ diff -u <(xxd file1) <(xxd file2)
--- /dev/fd/63  2022-03-06 15:40:23.811027810 +1100
+++ /dev/fd/62  2022-03-06 15:40:23.811027810 +1100
@@ -1 +1 @@
-00000000: 4120 4220 4320 4420 450a                 A B C D E.
+00000000: 4120 4220 5820 4420 450a                 A B X D E.

예, file1과 file2는 텍스트 파일이지만 텍스트 파일은 "텍스트" 문자만 포함하는 바이너리 파일의 하위 집합입니다. 이 예에서는 텍스트 파일을 만드는 것이 더 쉽습니다.

주목할 만한 점은 바이너리 파일의 작은 변경(예: 바이트 추가 또는 제거)이라도 diff엄청난 출력을 초래할 수 있다는 것입니다. 이 작은 변화 후에는 xxd또는 출력의 각 라인이 hexdump달라지기 때문입니다 . 따라서 이는 권장되지 않습니다. 너할 수 있다diff의 출력을 /dev/null로 리디렉션하고 종료 코드를 확인하지만 파일이 다른지 알고 싶다면 그냥 실행하는 것이 좋습니다 cmp.

해결책: 바이너리용 패치 파일을 생성하는 데 일반적으로 사용되는 아래 도구 중 하나인 바이너리 diff 도구를 사용하십시오. 예를 들어:

$ apropos diff | grep binary
radiff2 (1)          - unified binary diffing utility
bsdiff (1)           - generate a patch between two binary files
xdelta3 (1)          - VCDIFF (RFC 3284) binary diff tool

예를 들어

$ radiff2 file1 file2
0x00000004 43 => 58 0x00000004
$ 

xxdradiff2에는 더 읽기 쉬운 unidiff 출력 옵션도 있습니다( 하지만 출력이 두 개의 큰 파일의 비교 덤프보다 작은 지는 모르겠습니다 ).

$ radiff2 -u file1 file2 
-0x00000004:43  "C D E\n"
+0x00000004:58  "X D E\n"

파일이 동일하면 radiff2는 아무것도 출력하지 않습니다.

$ radiff2 file1 file1
$ 

답변2

내가 사용하는 명령줄에서바인딩 차이점.

관련 정보