Cách tốt nhất để so sánh (diff) một cấu trúc thư mục đầy đủ?


29

Cách tốt nhất để so sánh các cấu trúc thư mục là gì?

Tôi có một tiện ích sao lưu sử dụng rsync . Tôi muốn nói sự khác biệt chính xác (về kích thước tệp và ngày thay đổi lần cuối) giữa nguồn và bản sao lưu.

Cái gì đó như:

Local file                   Remote file                         Compare
/home/udi/1.txt (date)(size)   /home/udi/1.txt (date)(size)     EQUAL
/home/udi/2.txt (date)(size)   /home/udi/2.txt (date)(size)     DIFFERENT

Tất nhiên, công cụ này có thể được tạo sẵn hoặc một ý tưởng cho một kịch bản python.

Cảm ơn nhiều!

Udi

Câu trả lời:


18

Công cụ mà bạn đang tìm kiếm là ndiff . Nó hoạt động như kết hợp rsync và diff. Nó tạo ra một tệp vá mà bạn có thể so sánh hoặc phân phối.


9

Một số người muốn so sánh các hệ thống tập tin vì những lý do khác nhau, vì vậy tôi sẽ viết ở đây những gì tôi muốn và cách tôi đã làm nó.

Tôi muốn

  • Để so sánh cùng một hệ thống tập tin với chính nó, tức là chụp nhanh , thay đổi , chụp nhanh , so sánh .
  • Một danh sách các tập tin đã được thêm hoặc xóa, không quan tâm đến những thay đổi tập tin bên trong.

Tôi đã làm gì:

Ảnh chụp đầu tiên ( before.shtập lệnh):

find / -xdev | sort > fs-before.txt

Ảnh chụp nhanh thứ hai ( after.shkịch bản):

find / -xdev | sort > fs-after.txt

Để so sánh chúng ( diff.shkịch bản):

diff -daU 0 fs-before.txt fs-after.txt | grep -vE '^(@@|\+\+\+|---)'

Phần tốt là điều này sử dụng khá nhiều nhị phân hệ thống mặc định. Việc so sánh dựa trên nội dung có thể được thực hiện thông qua findmột -exectham số lặp lại đường dẫn tệp và MD5 sau đó.


8

nếu bạn không muốn cài đặt một công cụ khác ...

for host in host1 host2
do
  ssh $host ' 
  cd /dir &&
  find . |
  while
    read line
  do
    ls -l "$line"
  done ' | sort  > /tmp/temp.$host.$$
done
diff /tmp/temp.*.$$ | less
echo "don't forget to clean up the temp files!"

Và vâng, nó có thể được thực hiện với find và exec hoặc find và xargs dễ dàng như tìm trong vòng lặp for. Và, ngoài ra, bạn có thể tăng đầu ra của diff để nó nói những thứ như "tệp này nằm trên host1 chứ không phải host2" hoặc một số thứ như vậy nhưng tại thời điểm đó bạn cũng có thể chỉ cần cài đặt các công cụ mà mọi người khác đang nói về ...


5

Tôi đã sử dụng dirdiff trong quá khứ để so sánh các cấu trúc thư mục. Nó chỉ hoạt động trên các thư mục địa phương, do đó bạn sẽ phải đếm sshfscác thư mục khác của mình.

Điều tốt là bạn có thể nhìn thấy trực quan nếu các tệp bằng nhau hay không và tệp nào mới hơn hoặc cũ hơn. Và nó hỗ trợ tối đa 5 thư mục. Bạn cũng có thể thấy sự khác biệt và sao chép các tập tin từ cái này sang cái khác.


4

Từ trang người đàn ông rsync:

-n, --dry-run
This  makes rsync perform a trial run that doesn’t make any changes (and produces mostly
the same output as a real run).  It is most commonly used in combination  with  the  -v,
--verbose  and/or -i, --itemize-changes options to see what an rsync command is going to
do before one actually runs it.

Có thể điều này sẽ giúp.


Cảm ơn, nhưng nó không giải quyết được vấn đề của tôi (Tôi đang tìm kiếm sự khác biệt để thực sự nói lên sự khác biệt).
Adam Matan

4

diff -rthực sự hoạt động khá tốt Nếu bạn chỉ muốn biết nếu các tập tin khác nhau, không phải là nội dung thực tế của sự khác biệt, thì hãy làmdiff -qr


1
-rcó nghĩa là đệ quy, nó không kết nối với một máy chủ từ xa!
Michael Hampton

3

Tôi sẽ sử dụng Meld cho điều đó.


Meld hoạt động thực sự tốt cho việc này nếu bạn muốn một giải pháp GUI.
vẽ Noakes

2

Bên cạnh các công cụ đã được đề cập trên windows, bạn có thể sử dụng Total Commander hoặc WinSCP, cả hai đều có các chức năng rất thoải mái để so sánh (và đồng bộ hóa) các thư mục.


0

Tôi không thực sự muốn cài đặt bất cứ thứ gì mới, vì vậy giải pháp của tôi hơi thô sơ, nhưng nhanh chóng và hiệu quả.

Tôi muốn so sánh tất cả các tệp đã được sao chép và chế độ tệp, quyền sở hữu và bối cảnh bảo mật của Selinux vẫn không bị ảnh hưởng.

Thế là tôi chạy:

rsync -aX /orig /copy/

và sau đó so sánh như thế này:

cd /orig && ls -lZR > /tmp/diff_orig
cd /copy && ls -lZR > /tmp/diff_copy
vimdiff /tmp/diff_*

Nếu nội dung của cả hai tập tin vẫn bị sụp đổ thì chúng giống hệt nhau. Nếu không, diff được hiển thị.

Cập nhật các tham số lsđể phản ánh các thuộc tính bạn cần kiểm tra. YMMV

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.