CẬP NHẬT: Đã vài năm kể từ khi tôi đăng bài trả lời này và trong thời gian đó tôi đã viết lại và cải thiện kịch bản tôi đã trình bày ở đây nhiều lần. Tôi đã quyết định đăng lại kịch bản mới như một câu trả lời hoàn toàn mới. Tôi rất muốn giới thiệu nó qua cái này.
GIỚI THIỆU
Tôi đã quan sát thấy thứ tự mà lệnh find xuất ra các phần tử tìm thấy trong một thư mục khác nhau trong các thư mục giống hệt nhau trên các phân vùng khác nhau. Nếu bạn đang so sánh các giá trị băm của cùng một thư mục, bạn không phải lo lắng về điều đó nhưng nếu bạn nhận được các giá trị băm để đảm bảo rằng không có tệp nào bị bỏ sót hoặc bị hỏng trong một bản sao, bạn cần bao gồm một dòng bổ sung cho sắp xếp nội dung của thư mục và các yếu tố của nó. Ví dụ, câu trả lời của Matthew Bohnsack khá thanh lịch:
find ./path/to/directory/ -type f -print0 | xargs -0 sha1sum
Nhưng nếu bạn đang sử dụng nó để so sánh một thư mục được sao chép với thư mục gốc, bạn sẽ gửi đầu ra tới một tệp txt mà bạn sẽ so sánh với danh sách được xuất ra từ thư mục khác bằng cách sử dụng Kompare hoặc WinMerge hoặc chỉ bằng cách lấy các giá trị băm của mỗi lis . Vấn đề là, theo thứ tự mà công cụ tìm kiếm sẽ xuất nội dung có thể thay đổi từ thư mục này sang thư mục khác, Kompare sẽ báo hiệu nhiều sự khác biệt vì các giá trị băm không được sắp xếp theo cùng một thứ tự. Không phải là vấn đề lớn đối với các thư mục nhỏ nhưng khá khó chịu nếu bạn đang xử lý 30000 tệp. Do đó, bạn đã thực hiện các bước bổ sung sắp xếp đầu ra để dễ dàng so sánh danh sách băm giữa hai thư mục.
find ./path/to/directory/ -type f -print0 | xargs -0 sha1sum > sha1sum_list_unsorted.txt
sort sha1sum_list_unsorted.txt > sha1sum_list_sorted.txt
Điều này sẽ sắp xếp đầu ra để các tệp có cùng hàm băm sẽ nằm trên cùng một dòng khi chạy chương trình khác biệt (với điều kiện là không có tệp nào bị thiếu thư mục mới).
VÀ TRÊN NỀN TẢNG ...
Đây là một kịch bản mà tôi đã viết. Nó thực hiện những gì giống như câu trả lời find / xarg nhưng nó sẽ sắp xếp các tệp trước khi lấy sha1sum (giữ chúng trong cùng một thư mục). Dòng đầu tiên của tập lệnh tìm tất cả các tệp trong thư mục theo cách đệ quy. Tiếp theo sắp xếp các kết quả theo thứ tự abc. Hai phần sau, lấy nội dung được sắp xếp và nối thêm dấu sha1sum và dấu ngoặc kép vào các tệp trong danh sách được sắp xếp, tạo một tập lệnh shell lớn để tính toán từng tệp băm, mỗi lần một tệp và đưa nó vào content_sha1sum.txt.
#!/bin/bash
find . -type f > content.txt
sort content.txt > content_sorted.txt
awk '{print "sha1sum \""$0}' content_sorted.txt > temp.txt
awk '{print $0"\""}' temp.txt > get_sha1.sh
chmod +x get_sha1.sh
./get_sha1.sh > content_sha1sum.txt
rm content.txt
rm content_sorted.txt
rm temp.txt
rm get_sha1.sh
xdg-open content_sha1sum.txt
Hi vọng điêu nay co ich.