Đề xuất sử dụng của ire_and_curses tar c <dir>
có một số vấn đề:
- tar xử lý các mục trong thư mục theo thứ tự chúng được lưu trữ trong hệ thống tập tin và không có cách nào để thay đổi thứ tự này. Điều này thực sự có thể mang lại kết quả hoàn toàn khác nhau nếu bạn có thư mục "giống nhau" ở những nơi khác nhau và tôi biết không có cách nào để khắc phục điều này (tar không thể "sắp xếp" các tệp đầu vào của nó theo một thứ tự cụ thể).
- Tôi thường quan tâm đến việc liệu số nhóm và chủ sở hữu có giống nhau hay không, không nhất thiết là liệu đại diện chuỗi của nhóm / chủ sở hữu có giống nhau hay không. Điều này phù hợp với những gì ví dụ
rsync -a --delete
: nó đồng bộ hóa hầu như mọi thứ (trừ xattrs và acls), nhưng nó sẽ đồng bộ hóa chủ sở hữu và nhóm dựa trên ID của họ, chứ không phải trên biểu diễn chuỗi. Vì vậy, nếu bạn đã đồng bộ hóa với một hệ thống khác không nhất thiết phải có cùng người dùng / nhóm, bạn nên thêm --numeric-owner
cờ vào tar
- tar sẽ bao gồm tên tệp của thư mục bạn đang kiểm tra chính nó, chỉ cần một cái gì đó để nhận biết.
Miễn là không có cách khắc phục cho sự cố đầu tiên (hoặc trừ khi bạn chắc chắn rằng nó không ảnh hưởng đến bạn), tôi sẽ không sử dụng phương pháp này.
Các find
giải pháp dựa trên đề xuất ở trên cũng không tốt vì chúng chỉ bao gồm các tệp, không bao gồm các thư mục, sẽ trở thành một vấn đề nếu bạn kiểm tra nên ghi nhớ các thư mục trống.
Cuối cùng, hầu hết các giải pháp được đề xuất không sắp xếp nhất quán, vì đối chiếu có thể khác nhau giữa các hệ thống.
Đây là giải pháp tôi đã đưa ra:
dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum
Lưu ý về giải pháp này:
- Để
LC_ALL=C
đảm bảo thứ tự sắp xếp đáng tin cậy trên các hệ thống
- Điều này không phân biệt giữa một thư mục "có tên \ nwithanewline" và hai thư mục "có tên" và "withanewline", nhưng khả năng xảy ra điều đó dường như rất khó xảy ra. Người ta thường sửa lỗi này bằng
-print0
cờ find
nhưng vì có những thứ khác đang diễn ra ở đây, tôi chỉ có thể thấy các giải pháp làm cho lệnh trở nên phức tạp hơn nên nó có giá trị.
PS: một trong những hệ thống của tôi sử dụng một busybox hạn chế find
mà không hỗ trợ -exec
lẫn -print0
cờ, và cũng có thể nó gắn thêm '/' để biểu thị các thư mục, trong khi findutils tìm dường như không, vì vậy cho máy này, tôi cần phải chạy:
dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum
May mắn thay, tôi không có tệp / thư mục có dòng mới trong tên của họ, vì vậy đây không phải là vấn đề trên hệ thống đó.