Linux에서 동일한 크기의 두 파일에서 이진 차이를 어떻게 수행합니까?


37

크기가 동일한 두 개의 파일이 있으며 파일이 같은지 확인하려면 이진 diff를 수행해야합니다.

현재 runnnig diff file1.img file2.img이지만 4GB 파일을 처리하는 데 시간이 오래 걸립니다. 이것이 가장 효율적인 방법입니까?

답변:


45

cmp이진 파일의 차이점을 찾도록 설계되었습니다. 체크섬 ( sum)을 시도 하고 해시를 비교할 수도 있습니다 .


21

두 파일이 동일한 지 (크기가 일치한다고 가정) 판별하는 가장 일반적인 방법 중 하나는 프로그램을 사용하여 파일의 " 해시 "(본질적으로 지문)를 작성하는 것입니다. 가장 일반적인 것은 md5sumsha1sum입니다.

예를 들면 다음과 같습니다.

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

한 시스템에서 다른 시스템으로 파일이 가득 찬 디렉토리를 전송하는 경우와 같이 확인해야 할 파일이 많은 경우 원래 시스템의 출력을 파일로 재 지정할 수 있습니다. 그러면 해당 파일을 자동으로 사용하여 md5sum/ sha1sum어떤 파일이 다른지

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK

2
MD5는 항상 이것에 대한 신뢰할 수 없습니다 : digg.com/security/...
존 케이지

28
실제로 MD5 기본 무결성 검사에 안정적입니다. 우리가 한 번 생각했던 것만 큼 암호화 적으로 강력하지는 않습니다. 해커가 걱정된다면 MD5를 사용하지 말고 CD에서 복사 한 일부 파일이 손상되었는지 또는 컴파일러가 매번 동일한 파일을 뱉어 내는지 알고 싶다면 MD5가 충분합니다.
Adam Batkin


3

동일한 지 알고 싶다면 sha1sum 을 사용할 수 있거나 md5 를 대신 사용하는 것을 선호 합니다.

그것들이 얼마나 다른지 또는 어디가 다른지 알고 싶다면, 작동하는 한 가지는 od 파일 (보통 16 진 옵션이있는 'octal dump')을 통해 임시 파일을 만든 다음 파일을 비교하는 것입니다.


2
두 파일이 같은지 알고 싶다면 sha1sum (또는 그 문제에 대해 md5sum)을 사용하는 것이 diff보다 더 효율적이라고 생각하지 않습니다 (원래 질문이므로). 큰 파일은 처음에 다름), 파일이 다름을 알기 전에 두 파일을 모두 읽습니다.
Pierre

@Pierre BUT, 해싱 및 암호화 서명은 원격 장치에서 작동합니다.
VasyaNovikov

1

방금 100MB 이상의 파일에서 일부 벤치 마크를 실행했습니다. diff가 가장 빠르며 cmp가 2 위를 차지했으며 md5sum을 사용하는 것이 마지막에 왔습니다.

# time diff file1 file2; echo $?

real    0m0.122s
user    0m0.009s
sys 0m0.113s
0
# time cmp file1 file2; echo $?

real    0m0.213s
user    0m0.097s
sys     0m0.117s
0
# time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m0.279s
user    0m0.211s
sys     0m0.066s

real    0m0.316s
user    0m0.225s
sys     0m0.073s
0

4.3GB 파일로 연습을 다시 실행했으며 RAM 캐싱이 결과에 크게 영향을 미쳤으므로 dd를 사용하여 파일을 삭제하고 다시 만들어야했습니다.

$time diff file1 file2; echo $?

real    0m19.325s
user    0m0.995s
sys 0m5.280s
0

$time cmp file1 file2; echo $?

real    0m36.106s
user    0m4.399s
sys 0m6.147s
0

$time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m10.441s
user    0m8.054s
sys 0m2.357s

real    0m24.682s
user    0m8.027s
sys 0m3.442s
0

이 결과를 바탕으로 파일을 RAMFS 마운트로 옮기고 diff를 사용하는 것이 좋습니다.


나는 실제로 벤치 마크를했지만 100MB는 OP의 사례를 대표하지 않습니다. 1,000Mb가 훨씬 나을 것입니다.
jpaugh

1
몇 달 후 4.3 공연 테스트를 실행 한 이유에 동의했습니다. 실제로 OS 캐싱을 우회하기 위해 노력했습니다.
금지 자

나는 그것을 상상합니다. 답의 중간을 읽지 않아서 죄송합니다. (저는 여전히 첫 번째 벤치 마크 만 보더라도 공표하기에 충분하다고 생각했습니다.) FWIW에는 파일 캐싱을 비활성화 할 수있는 몇 가지 커널 마법 이 있습니다. 실제로 작동하거나 필요한 벤치 마크를 확인하려면 벤치 마크를 직접 수행해야합니다.
jpaugh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.