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
$
xxd
radiff2에는 더 읽기 쉬운 unidiff 출력 옵션도 있습니다( 하지만 출력이 두 개의 큰 파일의 비교 덤프보다 작은 지는 모르겠습니다 ).
$ radiff2 -u file1 file2
-0x00000004:43 "C D E\n"
+0x00000004:58 "X D E\n"
파일이 동일하면 radiff2는 아무것도 출력하지 않습니다.
$ radiff2 file1 file1
$
답변2
내가 사용하는 명령줄에서바인딩 차이점.