Làm cách nào để thực hiện một khác biệt nhị phân trên hai tệp có kích thước giống hệt nhau trong Linux?


37

Tôi có hai tệp có kích thước giống hệt nhau và tôi cần thực hiện một khác biệt nhị phân để kiểm tra xem chúng có giống nhau không.

Tôi hiện đang chạy diff file1.img file2.imgnhưng mất khá nhiều thời gian để xử lý các tệp 4 GB của mình. Đây có phải là cách hiệu quả nhất để làm điều này?

Câu trả lời:


45

cmpđược thiết kế để tìm sự khác biệt trong các tệp nhị phân. Bạn cũng có thể thử checksumming ( sum) và so sánh các giá trị băm.


21

Một trong những cách phổ biến nhất để xác định xem hai tệp có giống nhau không (giả sử kích thước của chúng khớp nhau) là sử dụng chương trình để tạo " băm " (về cơ bản là dấu vân tay) của tệp. Những cái phổ biến nhất là md5sumsha1sum.

Ví dụ:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

Nếu bạn có nhiều tệp cần kiểm tra, ví dụ: nếu bạn đang chuyển một thư mục chứa đầy các tệp từ hệ thống này sang hệ thống khác, bạn có thể chuyển hướng đầu ra từ hệ thống ban đầu sang một tệp, sau đó md5sum/ sha1sumcó thể tự động sử dụng tệp đó để báo bạn tập tin nào khác nhau:

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

2
MD5 không phải lúc nào cũng đáng tin cậy cho điều này: digg.com/security/ Khăn
Jon Cage

28
Trên thực tế, MD5 đáng tin cậy để kiểm tra tính toàn vẹn cơ bản. Nó chỉ không được coi là mạnh về mật mã như chúng ta từng nghĩ. Nếu bạn lo lắng về tin tặc, đừng sử dụng MD5, nhưng nếu bạn chỉ muốn biết liệu một số tệp được sao chép từ CD có bị hỏng hay không, nếu trình biên dịch của bạn phát ra các tệp giống hệt nhau mỗi lần, MD5 là quá đủ.
Adam Batkin


3

Nếu tôi chỉ muốn biết liệu chúng có giống nhau không, tôi thích sử dụng sha1sum nếu nó khả dụng hoặc md5 làm dự phòng.

Nếu tôi muốn biết chúng khác nhau như thế nào, hoặc chúng khác nhau như thế nào, một điều có tác dụng là xoay cả hai thông qua od ('bát phân bát', thường có tùy chọn hex) để tạo các tệp tạm thời và sau đó làm khác chúng.


2
Nếu bạn muốn biết liệu chúng có phải là hai tệp giống nhau hay không, tôi không nghĩ sử dụng sha1sum (hoặc md5sum cho vấn đề đó) có thể hiệu quả hơn so với chỉ khác (vì đây là câu hỏi ban đầu), bởi vì ngay cả khi cả hai ( lớn) các tệp khác nhau ngay từ đầu), bạn sẽ đọc cả hai hoàn toàn trước khi biết chúng khác nhau.
Pierre

@Pierre NHƯNG, băm và ký mã hóa hoạt động trên các thiết bị từ xa.
VasyaNovikov

1

Tôi chỉ chạy một số điểm chuẩn trên một tệp hơn 100 MB. diff là nhanh nhất, trong khi cmp đứng thứ hai và sử dụng md5sum cuối cùng.

# 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

Tôi chạy lại bài tập với tệp 4,3 GB và phải xóa và tạo lại tệp bằng dd vì bộ nhớ cache RAM ảnh hưởng lớn đến kết quả.

$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

Dựa trên những kết quả này, tôi khuyên bạn nên di chuyển các tệp sang ngàm RAMFS và gắn bó với diff.


Tôi thích rằng bạn thực sự đã làm một điểm chuẩn, nhưng 100 Mb không phải là đại diện cho trường hợp của OP. 1.000Mb sẽ tốt hơn nhiều.
jpaugh

1
đồng ý đó là lý do tại sao tôi đã chạy thử nghiệm 4.3 gig một vài tháng sau đó. Nó thực sự đã nỗ lực để bỏ qua bộ nhớ đệm hệ điều hành.
cấm

Tôi tưởng tượng nó làm. Tôi xin lỗi vì đã không đọc phần giữa câu trả lời của bạn. (Tôi vẫn nghĩ rằng nó đủ tốt để nâng cấp, ngay cả khi chỉ nhìn thấy điểm chuẩn đầu tiên.) FWIW, có một số phép thuật hạt nhân để vô hiệu hóa bộ đệm ẩn tệp. Tôi phải tự làm điểm chuẩn để xem cái nào thực sự hoạt động hoặc cần thiết.
jpaugh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.