이진 파일을 비교하여 동일한 지 확인하는 방법은 무엇입니까?


186

두 개의 이진 파일이 동일한 지 아닌지를 아는 가장 쉬운 방법은 무엇입니까 (우분투 리눅스에서 그래픽 도구 또는 명령 행 사용) (타임 스탬프 제외)? 실제로 차이를 추출 할 필요는 없습니다. 나는 그들이 같은지 아닌지를 알아야합니다.


5
쇼 묻는 질문 어떻게 그들이 다릅니다 superuser.com/questions/125376/...
치로 틸리郝海东冠状病六四事件法轮功

2
자세한 내용은 매뉴얼 페이지 cmp에서 바이트 단위 비교를 수행하므로 2 바이너리 파일의 기본값입니다. diff라인 단위이며 동일한 예 / 아니오 답변을 제공하지만 물론 표준 출력 스트림에 동일한 덤프는 아닙니다. 텍스트 파일이 아니기 때문에 줄이 길면 선호합니다 cmp. diff디렉토리 비교와 -r재귀를 지정하여 하나의 명령으로 여러 파일을 비교할 수 있다는 장점이 있습니다 .
H2ONaCl

답변:


180

표준 유닉스 diff는 파일이 동일한 지 여부를 보여줍니다.

[me@host ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ

명령에서 출력이 없으면 파일에 차이가 없음을 의미합니다.


5
diff는 정말 큰 파일에 문제가있는 것 같습니다 . 내가 가지고 diff: memory exhausted두 개의 13G 파일을 비교할 때.
Yongwei Wu

1
재미있는 결과물. diff그들이 "이진"이라고 말하고 있습니다. 모든 파일은 이진 파일로 간주 될 수 있으므로 이상한 주장입니다.
H2ONaCl

7
옵션으로 동일한 파일을보고 할 수 있습니다. diff -s 1.bin 2.bin또는 diff --report-identical-files 1.bin 2.bin다음과 같이 표시됩니다.Files 1.bin and 2.bin are identical
Tom Kuschel

1
아니, 그것은 그들이 "차이"라고 말할 것입니다, 그래서 그들은 같지 않습니다
Josef Klimuk

1
두 개의 실행 파일이 있는데 컴파일하고 실행했기 때문에 서로 다르다는 것을 알고 있지만 여기에 제공된 diff 및 cmp의 모든 옵션은 동일하다고 판단합니다. 왜? !!!
mirkastath

107

cmp명령을 사용하십시오 . 이진이 같으면 깨끗하게 종료되거나 첫 번째 차이점이 발생한 위치를 인쇄하고 종료합니다.


9
유스 케이스의 경우 OP는 IMHO가보다 cmp효율적 이라고 설명 diff합니다. 그래서 이것을 선호합니다.
halloleo

5
다음을 실행하는 쉘 스크립트가 있습니다.cmp $1 $2 && echo "identical" || echo "different"
steveha

2
cmp가 첫 번째 차이점을 발견했을 때 멈추고 표시하거나 파일 끝을 통과합니까?
sop

cmp"자동"모드가 있습니다 : -s, --quiet, --silent- suppress all normal output. 아직 테스트하지는 않았지만 첫 번째 차이가 있으면 멈추게 될 것이라고 생각합니다.
Victor Yarema

89

Visual Binary Diff 가 내가 찾던 것임을 알았 습니다.

  • 우분투 :

    sudo apt install vbindiff
    
  • 아치 리눅스 :

    sudo pacman -S vbindiff
    
  • MacPorts 를 통한 Mac OS X :

    port install vbindiff
    
  • Homebrew를 통한 Mac OS X :

    brew install vbindiff
    

1
좋아 ... 파일이 다른지 알고 싶었다. 그러나 정확한 차이점을 쉽게 볼 수있는 것이 훨씬 유용했습니다. 파일의 끝에 도착했을 때 segfault하는 경향이 있었지만 신경 쓰지 않아도 여전히 작동했습니다.
Jeremy

2
몇 번이나 언급되었지만 이것은 훌륭한 작은 프로그램입니다! (fyi 또한 homebrew에)
johncip

2
이것은 표준 diff 명령의 부드럽고 도움이되지 않는 결과보다 훨씬 우수한 방법이므로 허용되는 대답이어야합니다.
Gearoid Murphy

1
이진 diff에 가장 적합한 도구입니다.
칼라 카마 고

17

sha1을 사용하여 체크섬을 생성하십시오.

sha1 [FILENAME1]
sha1 [FILENAME2]

3
파일 중 하나에 대한 체크섬 만있는 경우 유용하지만 디스크에 두 파일이 모두 있으면 불필요합니다. diff그리고 cmp그들이 어떤 추가적인 노력없이 다른 경우 모두 당신을 말할 것이다.
johncip

1
그렇지 않아 sha1sum대신 sha1?
kol

2
NetBSD의 sha1, Linux의 sha1sum
Scott Presnell

2
다른 결과에도 불구하고 동일한 결과를 반환하는 두 파일이 있습니다. shattered.io
mik

2
SHA1에는 이미 하나의 공개 충돌 ( shattered.io )이있을 수 있으며 일부는 비공개 일 수도 있습니다. 한 번의 충돌로 수많은 충돌 파일을 생성 할 수 있습니다. 대신 해싱에 SHA2를 사용하십시오.
Michal Ambroz

12

바이너리 파일을 16 진수 표현으로 변환하기 위해 hexdump를 사용하여 meld / kompare / 다른 diff 도구로 열었습니다. 당신과 달리 나는 파일의 차이를 겪었습니다.

hexdump tmp/Circle_24.png > tmp/hex1.txt
hexdump /tmp/Circle_24.png > tmp/hex2.txt

meld tmp/hex1.txt tmp/hex2.txt

1
hexdump -v -e '/1 "%02x\n"'정확히 어떤 바이트가 삽입 또는 제거되었는지 확인 하려면 사용하십시오 .
윌리엄 Entriken

Meld는 이진 파일이 16 진으로 변환되지 않은 경우에도 작동합니다. 그것은 문자 세트에없는 것들에 대한 16 진수 값을 보여줍니다. 그렇지 않으면 일반 문자입니다. 이것은 ASCII 텍스트를 포함하는 이진 파일에 유용합니다. 많은 사람들은 적어도 마법의 끈으로 시작합니다.
Felix Dombek

7

MD5 해시 기능을 사용하여 두 파일이 동일한 지 확인할 수 있습니다.이 기능을 사용하면 낮은 수준의 차이점을 볼 수 없지만 두 파일을 비교하는 빠른 방법입니다.

md5 <filename1>
md5 <filename2>

두 MD5 해시 (명령 출력)가 동일하면 두 파일이 다릅니다.


7
당신의 다운 투표를 설명해 주시겠습니까? SHA1에는 4 개의 공감대가 있으며 OP에서 두 파일이 동일하거나 유사 할 가능성이 있다고 생각되면 충돌 가능성은 경미하며 MD5를 투표에 참여할 가치가 없지만 SHA1을 투표에 넘길 가치는 없습니다. MD5 대신 SHA1을 사용하는 암호 (다른 문제).
Rikki

2
이유는 확실하지 않지만 순수한 cmp는 파일의 해시 함수를 계산하고 비교하는 것 (최소 2 개의 파일에 대해서만)보다 효율적입니다.
Paweł Szczur

1
두 파일이 크고 동일한 디스크 (SSD하지 않음)에있는 경우 디스크 헤드의 움직임을 많이 저장 순차적으로 두 개의 파일을 읽을 수 있기 때문에 MD5 또는 SHA *이 변형 빠르게 수 있습니다
다니엘 알더

7
의견이 있어야 할 때 이전 (나쁜) 솔루션의 사소한 변형을 게시했기 때문에 하향 투표했습니다.
johncip

6

cmp 명령을 사용하십시오. 자세한 내용은 이진 파일 및 텍스트 비교 를 참조하십시오.

cmp -b file1 file2

1
-b"이진 모드"에서 파일을 비교하지 않습니다. 실제로 "GNU cmp에서는 -b또는 --print-bytes옵션을 사용하여 해당 바이트의 ASCII 표현을 표시 할 수도 있습니다 ." 이것은 내가 제공 한 수동 URL을 사용하여 찾은 것입니다.
Victor Yarema 5

빅터 야 레마, "바이너리 모드"가 무슨 뜻인지 모르겠습니다. cmp내 의견으로는 본질적으로 이진 비교입니다. 이 -b옵션은 단순히 첫 번째 바이트 만 인쇄합니다.
H2ONaCl

4

플래시 메모리 결함을 찾기 위해 차이점을 포함하는 모든 1K 블록을 보여주는이 스크립트를 작성해야했습니다 (첫 번째 블록뿐만 아니라 cmp -b)

#!/bin/sh

f1=testinput.dat
f2=testoutput.dat

size=$(stat -c%s $f1)
i=0
while [ $i -lt $size ]; do
  if ! r="`cmp -n 1024 -i $i -b $f1 $f2`"; then
    printf "%8x: %s\n" $i "$r"
  fi
  i=$(expr $i + 1024)
done

산출:

   2d400: testinput.dat testoutput.dat differ: byte 3, line 1 is 200 M-^@ 240 M- 
   2dc00: testinput.dat testoutput.dat differ: byte 8, line 1 is 327 M-W 127 W
   4d000: testinput.dat testoutput.dat differ: byte 37, line 1 is 270 M-8 260 M-0
   4d400: testinput.dat testoutput.dat differ: byte 19, line 1 is  46 &  44 $

면책 조항 : 5 분 안에 스크립트를 해킹했습니다. 명령 행 인수를 지원하지 않으며 파일 이름에서 공백을 지원하지 않습니다.


"r : not found"(GNU 리눅스 사용)를
얻습니다

@unseen_rider 어느 쉘, 어느 라인? sh -x디버깅 을 위해 스크립트를 사용하십시오
Daniel Alder

이것은 터미널에서 스크립트를 호출하여 이루어집니다. 라인은 9입니다.
unseen_rider

@unseen_rider이 방법으로 당신을 도울 수 없습니다. 스크립트가 정상입니다. 디버그 출력을 pastebin.com에 게시하십시오 . 여기서 무슨 의미인지 알 수 있습니다 : pastebin.com/8trgyF4A . 또한, 나에게의 출력 알려주세요readlink -f $(which sh)
다니엘 알더

마지막 명령이 제공합니다 /bin/dash. 현재 pastebin에 페이스트를 생성 중입니다.
unseen_rider

4

다음 옵션을 사용하여 Diff는 파일이 전혀 다른지 확인하기 위해 이진 비교를 수행하고 파일이 동일한 경우 출력됩니다.

diff -qs {file1} {file2}

다른 디렉토리에서 동일한 이름을 가진 두 파일을 비교하는 경우이 양식을 대신 사용할 수 있습니다.

diff -qs {file1} --to-file={dir2}

OS X 엘 캐피 탄


3

diff -s 시도

짧은 대답 : 스위치로 실행 diff하십시오 -s.

긴 대답 : 아래를 읽으십시오.


다음은 예입니다. 임의의 이진 내용으로 두 개의 파일을 만들어 봅시다 :

$ dd if=/dev/random bs=1k count=1 of=test1.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0100332 s, 102 kB/s

                                                                                  
$ dd if=/dev/random bs=1k count=1 of=test2.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0102889 s, 99,5 kB/s

이제 첫 번째 파일의 복사본을 만들어 봅시다 :

$ cp test1.bin copyoftest1.bin

이제 test1.bin과 test2.bin은 달라야합니다.

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

... 및 test1.bin과 copyoftest1.bin은 동일해야합니다.

$ diff test1.bin copyoftest1.bin

하지만 기다려! 출력이없는 이유는 무엇입니까?!?

대답은 : 의도적으로 설계된 것입니다. 동일한 파일에는 출력이 없습니다.

그러나 다른 오류 코드가 있습니다.

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

운 좋게도 -s(또는 --report-identical-files) 스위치 를 사용하여 diff를 더 장황하게 만들 수 있기 때문에 매번 오류 코드를 확인할 필요가 없습니다 .

$ diff -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical

2

Radiff2 는 일반 diff가 텍스트 파일을 비교하는 방법과 유사한 이진 파일을 비교하도록 설계된 도구입니다.

디스어셈블러 radiff2의 일부인 것을 시도하십시오 radare2. 예를 들어 다음 명령을 사용하면

radiff2 -x file1.bin file2.bin

차이점이 강조 표시되는 형식이 지정된 두 개의 열이 출력됩니다.


1

vim 패키지에서 xxd hex-dumper를 사용하는 가장 좋아하는 것 :

1) vimdiff (vim의 일부) 사용

#!/bin/bash
FILE1="$1"
FILE2="$2"
vimdiff <( xxd "$FILE1" ) <( xxd "$FILE2" )

2) diff 사용

#!/bin/bash
FILE1=$1
FILE2=$2
diff -W 140 -y <( xxd $FILE1 ) <( xxd $FILE2 ) | colordiff | less -R -p '  \|  '

0
md5sum binary1 binary2

md5sum이 같으면 이진이 같습니다

예 :

md5sum new*
89c60189c3fa7ab5c96ae121ec43bd4a  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt
root@TinyDistro:~# cat new*
aa55 aa55 0000 8010 7738
aa55 aa55 0000 8010 7738


root@TinyDistro:~# cat new*
aa55 aa55 000 8010 7738
aa55 aa55 0000 8010 7738
root@TinyDistro:~# md5sum new*
4a7f86919d4ac00c6206e11fca462c6f  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt

1
좀 빠지는. 가능성 만 높습니다.
sawa

실패 할 확률은 얼마입니까?
ashish

슬림하지만의 변형을 사용하는 것보다 diff선호하는 이유가 없습니다.
sawa

이 조언을 실용하려면 MD5 해시를 SHA2로 변경해야합니다. 요즘 누구나 랩톱에서 MD5에서 충돌을 일으킬 수 있으며이 단일 충돌 접두사 (동일한 크기, 동일한 접두사 및 동일한 MD5의 2 개 파일)를 기반으로 무한한 수의 충돌 파일 (동일한 접두사, 다른 충돌 블록, 동일한 접미사 포함)을 생성 할 수 있습니다
Michal Ambroz

-1

두 개의 이진 파일이 동일한 지 확인하는 비교적 간단한 방법이 있습니다.

프로그래밍 언어로 파일 입력 / 출력을 사용하는 경우 이진 파일의 각 비트를 자체 배열에 저장할 수 있습니다.

이 시점에서 점검은 다음과 같이 간단합니다.

if(file1 != file2){
    //do this
}else{
    /do that
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.