Đối với phiên bản 3.3 trở lên diff
, bạn nên sử dụng --no-dereference
tùy chọn, như được mô tả trong câu trả lời của Pete Harlan .
Thật không may, các phiên bản cũ hơn diff
không hỗ trợ bỏ qua các liên kết tượng trưng :
Một số tệp không phải là thư mục cũng không phải tệp thông thường: chúng là các tệp bất thường như liên kết tượng trưng, tệp đặc biệt của thiết bị, đường ống có tên và ổ cắm. Hiện tại, diff
xử lý các liên kết tượng trưng như các tệp thông thường; nó xử lý các tệp đặc biệt khác như các tệp thông thường nếu chúng được chỉ định ở cấp cao nhất, nhưng chỉ đơn giản là báo cáo sự hiện diện của chúng khi so sánh các thư mục. Điều này có nghĩa là patch
không thể đại diện cho các thay đổi đối với các tệp như vậy. Ví dụ: nếu bạn thay đổi tệp nào liên kết tượng trưng chỉ đến, hãy đưa diff
ra sự khác biệt giữa hai tệp, thay vì thay đổi thành liên kết tượng trưng.
diff
nên tùy ý báo cáo các thay đổi cho các tệp đặc biệt và patch
nên được mở rộng để hiểu các tiện ích mở rộng này.
Nếu tất cả những gì bạn muốn là xác minh một rsync (và có lẽ sửa những gì còn thiếu), thì bạn có thể chạy lệnh rsync lần thứ hai. Nếu bạn không muốn làm điều đó, thì kiểm tra tổng hợp thư mục có thể là đủ.
Nếu bạn thực sự muốn làm điều này với diff
, thì bạn có thể sử dụng find
để bỏ qua các liên kết tượng trưng và chạy diff trên từng tệp riêng lẻ. Truyền thư mục của bạn a và b vào làm đối số:
#!/bin/bash
# Skip files in $1 which are symlinks
for f in `find $1/* ! -type l`
do
# Suppress details of differences
diff -rq $f $2/${f##*/}
done
hoặc như một lớp lót:
for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done
Điều này sẽ xác định các tệp khác nhau về nội dung hoặc các tệp nằm trong một nhưng không phải trong b .
Lưu ý rằng:
- vì chúng tôi đang bỏ qua hoàn toàn các liên kết tượng trưng, điều này sẽ không được thông báo nếu tên liên kết tượng trưng không có trong b . Nếu bạn yêu cầu điều đó, bạn sẽ cần một lượt tìm thứ hai để xác định tất cả các liên kết tượng trưng và sau đó kiểm tra rõ ràng sự tồn tại của chúng trong b .
- Các tập tin bổ sung trong b sẽ không được xác định, vì danh sách được xây dựng từ nội dung của a . Đây có lẽ không phải là một vấn đề cho
rsync
kịch bản của bạn .