Tạo tổng kiểm tra md5 cho tất cả các tệp trong một thư mục


75

Tôi muốn tạo một danh sách tổng kiểm tra md5 cho tất cả các tệp trong một thư mục.

Tôi muốn cat filename | md5sum > ouptput.txt. Tôi muốn làm điều này trong 1 bước cho tất cả các tệp trong thư mục của tôi.

Bất kỳ trợ giúp sẽ là tuyệt vời.


Làm cách nào tôi có thể tìm thấy md5sum (tổng kiểm tra) của một tệp sao lưu cụ thể? - Kịch bản của tôi trông như thế nào - lệnh của nó là gì

Câu trả lời:


110

Bạn có thể vượt qua md5sumnhiều tên tệp hoặc bash mở rộng:

$ md5sum * > checklist.chk  # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk   # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK

Nếu bạn muốn có được sự ưa thích, bạn có thể sử dụng những thứ như findđể xem chi tiết và lọc các tệp, cũng như làm việc đệ quy:

find -type f -exec md5sum "{}" + > checklist.chk

1
♦ cách sử dụng phần trên để lấy md5sumcác tệp trong md5sum *thư mục con , phần phát ra ở trên đi vào cấp thư mục con bằng cách nói ... là một thư mục
Kasun Siyambalapitiya

Xin lỗi vì đã hỏi bằng cách chạy find -type f -exec md5sum '{}' +và `find -type f -exec md5sum '{}'` Tôi đã có thể lấy nó. Cảm ơn :)
Kasun Siyambalapitiya

Tôi thích giao diện của sản phẩm này hơn:openssl md5 * > checklist.txt
ashley

1
Nếu bạn đang sử dụng shell rất vui khi đánh giá **đệ quy (chẳng hạn như zsh), điều đó thậm chí còn đơn giản hơn:md5sum **/* 2>/dev/null
Joost

12

Một chương trình tạo / xác minh tổng kiểm tra tuyệt vời là rhash. Nó tạo ra các tệp tương thích SFV và cũng kiểm tra chúng.

Nó hỗ trợ md4, md5, sha1, sha512, crc32 và nhiều thứ khác.

Ngoài ra, nó có thể tạo đệ quy (tùy chọn -r) như md5deep hoặc sha1deep.

Cuối cùng nhưng không kém phần quan trọng, bạn có thể định dạng đầu ra của tệp tổng kiểm tra; ví dụ:

rhash --md5 -p '%h,%p\n' -r /home/

xuất ra một tệp CSV bao gồm đường dẫn đầy đủ của các tệp đệ quy bắt đầu với /homethư mục.

Tôi thấy cực kỳ hữu ích ngay cả tùy chọn -e đổi tên tập tin bằng cách chèn crc32 sum vào tên.

Bạn có thể thay đổi "md5sum" bằng "rhash" trong ví dụ PhoenixNL72.


1
Chính xác thì '/ home /' làm gì ở đây? Công cụ này có vẻ khá tốt.
Andy Ibanez

Tôi nghĩ đó là một lỗi, nó chắc chắn là lỗi đối với tôi. -P là định dạng cho đầu ra. Tôi sẽ sửa nó.
pbhj

7

Dưới đây là hai ví dụ mở rộng hơn:

  1. Tạo một tệp md5 trong mỗi thư mục chưa có, với các đường dẫn tuyệt đối:

    find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] &&  md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done 
    
  2. Tạo một tệp md5 trong mỗi thư mục chưa có: không có đường dẫn, chỉ có tên tệp:

    find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] &&  md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done 
    

Điều khác biệt giữa 1 và 2 là cách các tệp được trình bày trong tệp md5 kết quả.

Các lệnh làm như sau:

  1. Xây dựng một danh sách các tên thư mục cho thư mục hiện tại. (Cây)
  2. Sắp xếp danh sách thư mục.
  3. Kiểm tra trong mỗi thư mục nếu tệp @ md5sum.md5 tồn tại. Đầu ra Bỏ qua nếu nó tồn tại, đầu ra Xử lý nếu nó không tồn tại.
  4. Nếu tệp @ md5Sum.md5 không tồn tại, md5Sum sẽ tạo một tệp có tổng kiểm tra của tất cả các tệp trong thư mục. 5) Đặt tệp @ md5Sum.md5 được tạo thành chỉ đọc.

Đầu ra của toàn bộ tập lệnh này có thể được chuyển hướng đến một tệp (.....; xong> test.log) hoặc chuyển sang chương trình khác (như grep). Đầu ra sẽ chỉ cho bạn biết thư mục nào bị bỏ qua và đã được xử lý.

Sau khi chạy thành công, bạn sẽ kết thúc với tệp @ md5Sum.md5 trong mỗi thư mục con của thư mục hiện tại của bạn

Tôi đặt tên tệp là @ md5Sum.md5 để nó được liệt kê ở đầu thư mục trong phần chia sẻ samba.

Xác minh tất cả các tệp @ md5Sum.md5 có thể được thực hiện bằng các lệnh tiếp theo:

find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt

Sau đó, bạn có thể grep checklog.txt bằng grep -v OK để có danh sách tất cả các tệp khác nhau.

Để tạo lại một @ md5Sum.md5 trong một thư mục cụ thể, chẳng hạn như khi bạn thay đổi hoặc thêm tệp, hãy xóa tệp @ md5Sum.md5 hoặc đổi tên nó và chạy lại lệnh tạo.


Lệnh # 1 sử dụng đường dẫn đầy đủ: md5sum "$ {dir}" / * không chọn các tệp ẩn bắt đầu bằng dấu chấm. Biện pháp khắc phục nào?
dùng14654

Đến bữa tiệc muộn, nhưng vì md5sum muốn tên tệp (có vẻ không vui nếu bạn cho nó một thư mục) nên có thể dễ dàng nhất để yêu cầu tìm sự giúp đỡ: $ md5sum $ (tìm "$ dir" -maxdepth 0 -type f) "- loại f "kéo các tệp thông thường và .hidden (cũng vậy, find có nhiều tùy chọn, nhưng có thể siêu hữu ích). Bỏ qua phần "-maxdepth 0" nếu bạn muốn mọi thứ đệ quy. Lưu ý: điều này rất mong manh nếu tên tệp có dấu cách được nhúng, sau đó bạn có thể đọc lên xargs và -0 ( en.wikipedia.org/wiki/Xargs )
jgreve 17/03/18

0

Tôi gặp phải vấn đề này và trong khi các giải pháp ở trên rất thanh lịch, tôi muốn có một bản hack nhanh và bẩn cho tình huống này: 1 thư mục, với các thư mục con một cấp nằm sâu bên trong nó.

Vì vậy, nhập thư mục trong một shell và chạy:

md5sum * */* 2>/dev/null > md5sum.md5

Điều này nhận được tất cả các tệp trong thư mục cấp cao nhất, loại bỏ cảnh báo lỗi về các thư mục con là thư mục và sau đó chạy md5sums trên nội dung thư mục con. Ưu điểm: dễ nhớ, thực hiện chính xác những gì nó phải làm. Tôi luôn bị nhầm lẫn bởi tìm cú pháp và không bao giờ có thể nhớ nó ra khỏi đỉnh đầu của tôi, vì vậy không cần phải lặp, v.v., xử lý khoảng trắng trong tên thư mục, lớp lót này hoạt động tốt. Không phải là một giải pháp mạnh mẽ mạnh mẽ, không tốt cho> 1 cấp thư mục con, nhưng là một cách khắc phục nhanh chóng và dễ dàng cho vấn đề.

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.