Có một công cụ Linux như diff sẽ so sánh đệ quy các tệp và thư mục, nhưng với việc bổ sung cũng so sánh: các thuộc tính mở rộng, acl's, se bối cảnh?
Có một công cụ Linux như diff sẽ so sánh đệ quy các tệp và thư mục, nhưng với việc bổ sung cũng so sánh: các thuộc tính mở rộng, acl's, se bối cảnh?
Câu trả lời:
Tôi đã làm điều này trước khi sử dụng rsync -aHAX --delete
ghi nhớ để thêm -n
và -i
cờ.
Điều này hơi phản trực giác, nhưng hãy chịu đựng tôi. Lệnh chính rsync
là những gì bạn sẽ cần để đồng bộ hai thư mục với nhau. Nhưng -n -i
làm cho nó KHÔNG đồng bộ hóa (tức là chạy khô) và chỉ in ra những gì nó sẽ làm và tại sao. Thật không tuyệt vời khi phân tích cú pháp, nhưng bạn có thể lấy tên tệp ra một cách dễ dàng và chuyển sang ls
hoặc tương tự.
Điều này sẽ xem xét tất cả mọi thứ bao gồm mtimes, ngày, v.v., cũng như không theo dõi trên các nút thiết bị, ổ cắm, đường ống có tên, v.v ... Dòng lệnh ở trên cũng nhìn vào ACL và các thuộc tính mở rộng. Bạn có thể điều chỉnh những gì bạn đang xem bằng cách thay đổi các tùy chọn rsync
, giới hạn nó ở một thiết bị -x
, thay đổi hành vi liên kết mềm & cứng, v.v.
janos đã nói phải làm gì:
find /a -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >a
find /b -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >b
diff -u a b
Và man 1 stat
nói:
%A access rights in human readable form
%C SELinux security context string
%F file type
%g group ID of owner
%u user ID of owner
%s total size, in bytes
%Y time of last modification, seconds since Epoch
%n file name
Để so sánh nội dung tập tin bạn có thể sử dụng:
find -type f -exec md5sum '{}' ';' | sort | uniq --all-repeated=separate -w 33 | cut -c 35-
as described here: http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash
find
có các tính năng của GNU stat
được tích hợp (và có trước GNU stat trong nhiều thập kỷ). Bạn cũng sẽ muốn sắp xếp đầu ra trước khi khác. Và bạn cần (cd /a && find . ...)
nếu không tất cả các dòng sẽ khác nhau vì /a
so với /b
trong đường dẫn tệp.
Đây là một tập lệnh bash nhanh mà tôi đã viết để so sánh các thuộc tính mở rộng. Nó in ra mọi tên tệp và sau đó là bất kỳ sự khác biệt nào trong các thuộc tính:
cd a
export relpath=[path/to/b/from/a]
for filename in $(find .);
do
echo $filename;
diff <(xattr -l $filename) <(xattr -l $relpath/$filename);
done
Mượn từ một câu trả lời khác, chúng tôi có thể sửa đổi điều này để sử dụng stat
thay vì xattr
:
for filename in $(find .);
do
echo $filename;
diff <(stat -c '%A %C %F %g %u %s %Y' $filename) <(stat -c '%A %C %F %g %u %s %Y' $relpath/$filename);
done