Tính toán tổng kiểm tra MD5 của một thư mục


29

Tôi đang tìm kiếm một cách nhanh chóng để so sánh nội dung thư mục. Có thể thực hiện một md5sum (hoặc tổng kiểm tra tương đương) của toàn bộ thư mục không?

Sử dụng Ubuntu Linux


Bạn cũng có thể muốn xem xét việc sử dụng diff để so sánh các thư mục thực sự sẽ cho bạn thấy các thư mục khác nhau ở đâu. unixtutorial.org/2008/06/how-to-compare-directories-in-unix
Kibbee

@Kibbee Để ngăn chặn điều đó, bạn cần tính đến một cái gì đó ngoài nội dung dữ liệu của từng tệp và chính xác cách bạn kiểm tra các tệp. Cho trước: [tổng kiểm] 1. A (Thư mục) - File1 [ABC] - File2 [CBA] 2. B (Thư mục) - File1 [ABC] - B1 (Thư mục) - File2 [CBA] 3. C (Thư mục) - File4 [ABC] - File5 [CBA] 4. D (Thư mục) - Bản sao File1 [ABC] - Bản sao File2 [CBA] Thư mục AB không giống nhau mặc dù chúng chứa cùng một tệp (mặc dù trong B1 , File2 nằm trong thư mục con) . Theo ví dụ của bạn, AC sẽ được coi là giống hệt nhau vì
Jacob Lyles

Câu trả lời:


36

Chắc chắn rồi - md5sum directory/*

Nếu bạn cần một cái gì đó linh hoạt hơn một chút (giả sử, để đệ quy thư mục hoặc so sánh băm), hãy thử md5deep.

apt-get install md5deep
md5deep -r directory

Để so sánh cấu trúc thư mục, bạn có thể cung cấp cho nó một danh sách các giá trị băm để so sánh với:

md5deep -r -s /directory1 > dir1hashes
md5deep -r -X dir1hashes /directory2

Điều này sẽ xuất ra tất cả các tệp trong thư mục2 không khớp với thư mục1.

Điều này sẽ không hiển thị các tệp đã bị xóa khỏi thư mục1 hoặc các tệp đã được thêm vào thư mục2.


Không phải những gì tôi muốn nói, mà là những gì tôi muốn :) Tôi đã có nghĩa là đệ quy và nhận được MỘT hàm băm ở cuối, nhưng tôi nghĩ điều này có thể được thực hiện với md5deep -l và tự băm kết quả đầu ra.
cá nóc

1
Thứ tự băm không nhất quán, do đó sẽ phải sắp xếp đầu ra trước khi băm
cá nóc

1
Để có được một thứ tự xác định, sử dụng -j0để vô hiệu hóa đa luồng (xem trang hướng dẫn).
Johann

1
@ ShaneMadden ♦ Tôi đã cài đặt md5deepvới sudo apt-get install md5deeptrên Ubuntu 16.04nhưng khi tôi cố gắng đọc man page của nó nói với tôi rằng> Không bài hướng dẫn về md5deep
Kasun Siyambalapitiya

27

Nếu bạn muốn xem có gì khác nhau (nếu có gì) giữa hai thư mục, rsync sẽ phù hợp.

rsync --archive --dry-run --checksum --verbose /source/directory/ /destination/directory

Điều này sẽ liệt kê bất kỳ tập tin nào khác nhau.


2
diff -qr /source/directory/ /destination/directory/cũng sẽ hiển thị các tập tin khác nhau.
Konerak

Có cách nào để thực hiện so sánh bitwise thay vì tổng kiểm tra không? Nó có thể nhanh hơn trên các ổ đĩa cục bộ.
Ali

Rất đẹp. Hoạt động nếu nguồn hoặc đích cũng là thư mục từ xa, ví dụ:username@hostname:/destination/directory
Thalis K.

11

tôi nghĩ rằng tôi đã trả lời câu hỏi này trước đây với câu trả lời này:

find . -xtype f -print0 | xargs -0 sha1sum | cut -b-40 | sort | sha1sum

cho: b1a5b654afee985d5daccd42d41e19b2877d66b1

ý tưởng là bạn băm tất cả các tệp cắt bỏ băm một dòng trên mỗi dòng, sắp xếp chúng và băm mang lại một hàm băm duy nhất. Điều này không phụ thuộc vào tên của các tập tin.


5

Các cfv ứng dụng là khá hữu ích, không chỉ nó có thể kiểm tra và tạo checksum MD5, nó cũng có thể làm CRC32, sha1, torrent, mệnh, par2.

để tạo tệp tổng kiểm tra CRC32 cho tất cả các tệp trong thư mục hiện tại:

cfv -C

để tạo tệp tổng kiểm MD5 cho tất cả các tệp trong thư mục hiện tại:

cfv -C -t md5 -f "thư mục hiện tại.md5sums"

Để tạo một tệp tổng kiểm tra riêng cho mỗi thư mục con:

cfv -C -r

Để tạo một tệp tổng kiểm tra "siêu" chứa các tệp trong tất cả các thư mục con:

cfv -C -rr

4

Tôi đã sử dụng hashdeep, như được giải thích trong câu trả lời của Askubfox này: Kiểm tra tính chính xác của các tệp được sao chép :

Để tính toán tổng kiểm tra:

 $ cd <directory1>
 $ hashdeep -rlc md5 . > ~/hashOutput.txt

Để xác minh và liệt kê sự khác biệt:

 $ cd <directory2>
 $ hashdeep -ravvl -k ~/hashOutput.txt .
 hashdeep: Audit passed
    Input files examined: 0
   Known files expecting: 0
           Files matched: 13770
 Files partially matched: 0
             Files moved: 0
         New files found: 0
   Known files not found: 0

Điều này có một lợi thế so với md5deep ở chỗ nó sẽ hiển thị các tệp đã được đổi tên (đã di chuyển), đã thêm và xóa, cũng như tránh sự cố với các tệp có độ dài 0 được chỉ ra ở dưới cùng của http://www.meridiandiscovery.com/how- đến / xác thực-sao chép-kết quả-sử dụng-md5deep .


3

Điều này làm việc cho tôi: (chạy nó trong thư mục bạn quan tâm)

md5deep -rl . | awk '{print $1}' | sort -n | md5sum

1

Bạn có thể tạo tổng MD5 của mỗi tệp đơn lẻ, sắp xếp các tổng kiểm này theo thứ tự bảng chữ cái và có chúng (có hoặc không có dòng mới). Vì MD5 là mật mã, nên nó chỉ hoạt động tốt với băm băm.

Cần có một thứ tự nhất định cho mọi thứ, nếu không bạn sẽ nhận được kết quả khác nhau cho các thư mục bằng nhau.

Và bạn nên xem xét rằng việc thêm một số tập tin vào một thư mục hoàn toàn sẽ thay đổi kết quả, thậm chí nếu nó chỉ là một .directorycủa .DS_Storetập tin.


Về mặt kỹ thuật, người ta có thể nhận được cùng một hàm băm cho các thư mục khác nhau. Nếu dir A có 2 tệp có nội dung 'ab' và 'c' và dir B có 2 tệp có nội dung 'a' và 'bc' thì chỉ băm dữ liệu trong các tệp sẽ mang lại kết quả tương tự, mặc dù chúng có tệp với nội dung khác nhau. Tôi thậm chí không chắc người ta sẽ định nghĩa MD5Sum của một thư mục như thế nào.
Kibbee

1

Trong trường hợp cụ thể, giả sử bạn muốn sao chép một số tệp từ thư mục1 sang thư mục 2 và sau đó bạn muốn xác minh bản sao thành công bằng cách sử dụng so sánh md5.

Đầu tiên. cd vào thư mục1 và gõ:

find -type f -exec md5sum "{}" \; > ~/Desktop/md5sum.txt

sẽ tạo một tệp tham chiếu chứa tổng md5 cho mỗi tệp trong thư mục1. Một khi điều này được thực hiện, tất cả những gì bạn phải làm là cd vào thư mục2 và gõ:

md5sum -c ~/Desktop/md5sum.txt

Chương trình md5sum tìm nạp từng đường dẫn từ tệp md5sum.txt, tính toán md5sum của tệp đó trong thư mục đích và sau đó so sánh nó với tổng mà nó đã lưu trong tệp.

Sau khi quá trình hoàn tất, bạn sẽ nhận được một bản tóm tắt, chẳng hạn như 'Vì vậy, rất nhiều tệp không khớp với nhau' hoặc đại loại như thế.



1

Tôi đã có nhu cầu xác minh tính toàn vẹn của các bản sao lưu / gương chứa một số lượng lớn tệp và cuối cùng đã viết một chương trình dòng lệnh có tên là MassHash. Nó được viết bằng Python. Trình khởi chạy GTK + cũng có sẵn. Bạn có thể muốn kiểm tra ...

http://code.google.com.vn/p/masshash/

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.