Có MD5 (hoặc tương tự) với một thư mục? Làm thế nào để xác minh nếu hai thư mục bằng nhau?


10

Tôi muốn tìm một md5sum(hoặc tính toán tương tự) của một thư mục mà không nén nó vào một kho lưu trữ.

Ví dụ, nếu trong thư mục MyFolderchúng tôi có các tập tin 1.txt, 2.txt3.txt, bao gồm:


1.txt

Văn bản thành 1.txt

2.txt

Văn bản thành 2.txt

3.txt

Văn bản thành 3.txt


Làm thế nào tôi có thể tính toán md5sumtoàn bộ điều này MyFolder? Là có một cách? Tôi muốn sử dụng điều này để xác minh nếu hai thư mục có cùng nội dung.

Điều này có thể được sử dụng để xác minh nếu hai đĩa hoặc thư mục bằng nhau. Tôi muốn một cách dễ dàng để làm điều đó.

Câu trả lời:


15

Công cụ md5deep được phát triển cho mục đích chính xác này. Nhiều bản phân phối Linux cung cấp nó ở dạng gói.


1
Cám ơn! Nó làm việc tốt với tôi. Để những người dùng khác có cùng vấn đề thích điều này: sudo apt-get install md5deep md5deep -rel /path/to/your/directory/ > directory_hash.md5 md5deep -X directory_hash.md5 -r /path/to/your/second/direcotory Thx rất nhiều.
GarouDan

@GarouDan. Lệnh bạn đã hiển thị sẽ theo các liên kết tượng trưng. Bạn có thể sử dụng -otùy chọn để xử lý các loại tệp.
Peter.O

Oh thx ... không biết rằng ... thực sự hữu ích. Tôi sẽ nhớ!
GarouDan

4

Nếu bạn không muốn lưu trữ nó, có lẽ bạn có thể làm một cái gì đó như thế này

diff <(find folder1) <(find folder2)

Bạn có thể phải điều chỉnh các findlệnh để chính xác hơn.

EDIT Bạn có thể thêm -execvào cuộc gọi tìm kiếm của mình để so sánh nội dung của các tệp. Một cái gì đó tương tự như thế này:

diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)

Hãy nhớ rằng bạn có thể muốn thích nghi với điều này.


Đó là một điểm thú vị. Điều này liệt kê tất cả các tệp của mỗi thư mục ... nhưng nếu tôi có một lượng lưu trữ thực sự lớn ... làm thế nào để xác minh có cùng các tệp (với dữ liệu - có thể sử dụng công cụ md5sum) trong mỗi thư mục?
GarouDan

1
Sau đó thực hiện một khác biệt của đầu ra MD5SUM của mỗi tệp. Bạn chỉ cần xâu chuỗi các lệnh find, md5sum và diff khác nhau.
sybreon

Thx về ý tưởng của bạn quá, cya ... Tôi sẽ thử những điều thú vị với những điều này sau khi ... cảm ơn.
GarouDan

3

Một cách để kiểm tra có thể là tạo md5sum dựa trên việc ghép tất cả các tệp trong thư mục và các thư mục con của nó. Hãy nhớ rằng điều này cũng yêu cầu các tệp có cùng tên (vì chúng phải theo cùng một thứ tự sắp xếp). Các mã sau đây sẽ hoạt động:

#!/bin/bash

shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }

for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done

(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }

_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)

{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }

Nếu bạn thực sự quan tâm đến tên tệp, v.v., bạn có thể sử dụng một vòng lặp để so sánh những gì trong ${_files_in_old_dir}${_files_in_new_dir}. Điều này sẽ làm việc cho hầu hết các trường hợp (ít nhất nó sẽ kiểm tra số lượng tệp trong thư mục và thư mục con của nó).


Đây là một kịch bản hay ... thx @Chris. Nhưng nó có một vấn đề ... sử dụng mèo , thư mục con gặp sự cố ... Bạn có ý tưởng nào để giải quyết nó không? Cảm ơn nhiều.
GarouDan

Việc này ổn với tôi. Hãy chắc chắn rằng vỏ của bạn hỗ trợ globstar. Lỗi là gì?
Chris Xuống

1
Nó "hoạt động" (+1) ... nhưng globalstar trong bash 4 tuân theo các liên kết tượng trưng của thư mục , nhưng đó chỉ là vấn đề nếu một trong hai thư mục chứa một liên kết tượng trưng.
Peter.O

@fered Cuộc gọi tốt, tôi đã thêm vào một bài kiểm tra.
Chris Xuống

0

Tôi nhận thấy bài đăng gốc khá cũ, tuy nhiên, tôi nghĩ thông tin này vẫn có thể có giá trị đối với những người đang tìm giải pháp để xác minh rằng các tệp được sao chép chính xác. Rsync có thể là phương pháp tốt nhất để sao chép dữ liệu và câu trả lời được đưa ra trong chuỗi này là tốt, tuy nhiên đối với những người không có kinh nghiệm với Linux, tôi sẽ cố gắng đưa ra lời giải thích chi tiết hơn.

Kịch bản: Bạn vừa sao chép dữ liệu từ đĩa sang đĩa khác, với rất nhiều thư mục con và tệp. Bạn muốn xác minh rằng tất cả các dữ liệu được sao chép chính xác.

Trước tiên hãy kiểm tra xem md5deep đã được cài đặt bằng cách ban hành lệnh md5deep -v.

Nếu bạn nhận được một thông báo có nội dung như 'không tìm thấy lệnh', thì hãy cài đặt md5deep bằng cách apt-get install md5deep.

Giả sử bạn chỉ muốn xử lý các tệp thông thường. Nếu bạn muốn xử lý các loại tệp khác, hãy tham khảo cờ -o trong hướng dẫn md5deep. ( man md5deep)

Bây giờ bạn đã sẵn sàng và chúng tôi giả định rằng bạn đã sao chép các tệp từ /mnt/orginalsang /mnt/backup, thay thế các tệp này cho bất kỳ thư mục nào bạn đang sử dụng.

Đầu tiên thay đổi thư mục nguồn, đây là nguồn ban đầu cho các tệp bạn đã sao chép hoặc sao lưu:

cd /mnt/orginal

Sau đó thực hiện tổng kiểm tra của mỗi tệp:

md5deep -rel -o f . >> /tmp/checksums.md5

Lệnh này đã giải thích:

-r cho phép chế độ đệ quy

-e hiển thị chỉ báo tiến độ

-l cho phép đường dẫn tập tin tương đối.

-o f chỉ hoạt động trên các tệp thông thường (không phải thiết bị chặn, đường ống có tên, v.v.)

. nói với md5deep để bắt đầu trong thư mục hiện tại.

>> /tmp/checksums.md5nói với md5deep để chuyển hướng tất cả đầu ra /tmp/checksums.md5.

Lưu ý, nếu bạn muốn ghi đè lên nội dung trong các phiên bản trước /tmp/checksums.md5, hãy sử dụng >và không>>

Lưu ý rằng lệnh này có thể mất nhiều thời gian, tùy thuộc vào tốc độ io và kích thước của dữ liệu. Bạn có thể thử nghiệm với tốt và / hoặc ionice để tăng hiệu suất của md5deep, nhưng điều đó nằm ngoài phạm vi của câu trả lời này.

Khi việc tạo tổng kiểm tra kết thúc, bây giờ bạn có một tệp có các mục tương tự như:

69c0a826b29c8fbbb /etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.cache

Cột đầu tiên là tổng kiểm tra md5 và cột thứ hai là đường dẫn tương đối đến tệp mà tổng kiểm tra thuộc về.

Nếu bạn muốn xem có bao nhiêu tệp tồn tại trong tệp tổng kiểm tra, hãy đưa ra lệnh:

wc /tmp/checksums.md5 -l

Bây giờ, bạn muốn kiểm tra xem dữ liệu đã sao chép có đúng không:

cd /mnt/backup

md5deep -o f -reX /tmp/checksums.md5 . >> /tmp/compare.result

Sự khác biệt duy nhất so với khi chúng tôi tạo tổng kiểm tra là -X hiển thị hàm băm hiện tại của một tệp nếu mục nhập trong tệp checksums.md5 không khớp. Vì vậy, vào cuối thử nghiệm, nếu /tmp/compare.resulttrống, bạn có thể tin tưởng rằng tất cả các tệp được sao chép chính xác vì tổng kiểm tra khớp.

Lưu ý rằng chỉ các tệp được liệt kê trong /tmp/checksums.md5tệp sẽ được kiểm tra để kiểm tra chính xác, nếu có bất kỳ tệp bổ sung nào trong /mnt/backupthư mục, md5deep sẽ không thông báo cho bạn về những điều này.

Ghi chú:

  • Bạn không nhất thiết phải sử dụng chuyển hướng để lưu trữ các tệp đầu ra. Tham khảo hướng dẫn sử dụng md5deep để biết thêm thông tin.

  • Bạn có thể phải chạy các lệnh md5deep với quyền root, tùy thuộc vào quyền của các tệp bạn đang xử lý.


0

Nếu bạn muốn kiểm tra một cách đệ quy sự khác nhau giữa hai thư mục /path1/path2 không sử dụng md5deep:

diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)

Giải trình:

  • đã vào path1để làm cho tất cả các dòng được in bằng findtương đối với path1( cd /path1)
  • liệt kê tất cả các tệp đệ quy trong đường dẫn hiện tại ( && find . -type f)
  • sử dụng mỗi đầu ra dòng bằng cách findlàm đầu vào cho md5( | xargs md5)

Đầu ra sẽ trông như thế này nếu chúng có bất kỳ sự khác biệt nào:

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
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.