Làm thế nào tôi có thể dễ dàng xác nhận trong Linux rằng hai thư mục riêng biệt có cùng nội dung?


8

CentOS 5.x

Câu hỏi Mq có vẻ tương tự như câu hỏi này nhưng tôi không chắc ...

Tôi có hai máy chủ (cách ly hoàn toàn với nhau), mỗi máy chủ có một thư mục và thư mục con nên có cùng nội dung chính xác.

Ví dụ: bố cục thư mục có thể là một cái gì đó như:

MÁY CHỦ A -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

MÁY CHỦ B -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

Lý tưởng nhất là tôi muốn một cách để kiểm tra đệ quy và có một cái gì đó xác nhận rằng mọi thứ đều khớp.

Tôi cũng muốn tránh sử dụng bất kỳ công cụ của bên thứ ba.

Có ý kiến ​​gì không?


Bạn chỉ muốn so sánh hai thư mục, hoặc thực sự làm cho một bản sao của thư mục kia?
Scott Pack

@ScottPack Câu hỏi tuyệt vời. Tôi muốn so sánh nhưng KHÔNG thực hiện bất kỳ thay đổi. Một cái gì đó khác đang xử lý sự sao chép của các thư mục. Tôi chỉ muốn chắc chắn rằng nó đang làm công việc của nó.
Mike B

1
Bạn đã gắn thẻ câu hỏi này rsync? Vậy ... uhm, sử dụng rsync(với -ntùy chọn)?
mạo

@faker Tôi nghĩ rsync có thể là tùy chọn nhưng không chắc chắn nếu có thứ gì đó tốt hơn, dễ dàng hơn hoặc cụ thể hơn cho trường hợp sử dụng này. Tôi cần biết rằng tên tệp, ngày, kích thước và vị trí tương đối khớp.
Mike B

lưu ý rằng rsync không kiểm tra nội dung tệp nếu thời gian và kích thước khớp nhau, hãy xem tùy chọn --checksum nếu điều này làm bạn lo lắng
hầm

Câu trả lời:


9

Một cách tốt là sử dụng md5sums trên mỗi tệp trong cây:

Chạy cái này trên server1:

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server1.tx

Chạy cái này trên server2

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server2.tx

Sau đó, chỉ cần so sánh hai tập tin (sử dụng diff) hoặc bất cứ điều gì bạn thích.

Có phải đó là những gì bạn đang tìm kiếm?

Tất nhiên, bạn có thể sử dụng SSH để thực hiện lệnh từ xa nếu muốn.


Cảm ơn Camden. Vâng, tôi nghĩ rằng đây là những gì tôi đang tìm kiếm. Tôi sẽ kiểm tra nó và xem nếu nó hoạt động.
Mike B

2
Hoặc md5sum md5sums
dmourati

Tuyệt vời - đúng, nếu bạn không quan tâm đến việc thay đổi tệp nào, bạn có thể chỉ cần md5sum các tệp kết quả và so sánh hai khoản tiền đó.
Camden S.

Ngoài ra, có lẽ bạn đã biết điều này, nhưng để thực thi lệnh đó từ xa qua SSH, bạn chỉ cần làmssh user@servera 'find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum'
Camden S.

1
MikeB, bằng cách thực hiện danh sách dài đệ quy và chuyển nó đến md5sum, bạn sẽ nhận được md5sum của danh sách thư mục, sẽ loại trừ nội dung của các tệp. Nếu kích thước inode trên các hệ thống tập tin ở hai đầu là khác nhau thì nó cũng có thể tạo ra sự khác biệt về kích thước tệp. Thực hiện md5sum về nội dung như được đề xuất ban đầu bởi @CamdenS. tốt hơn.
nearora

7

Nếu bạn không nhất thiết quan tâm đến những gì đã thay đổi, chỉ cần một cái gì đó đã thay đổi, rsync vẫn thực sự tốt cho điều đó. Hãy thử chạy lệnh này và đi lang thang ở đầu ra, giả sử điều này được chạy từ 'servera'.

rsync -avcn /opt/foo/ serverb:/opt/foo

Danh sách kết quả sẽ là những tệp đã được sửa đổi nếu bạn thực sự chạy quá trình đồng bộ hóa. Hãy nhớ rằng các tệp sẽ hiển thị trong danh sách ngay cả khi chỉ dấu thời gian thay đổi, nhưng nội dung vẫn giữ nguyên. Vì chúng tôi đã thêm -ncờ, nên sẽ không có hành động nào thực sự được thực hiện, chỉ được báo cáo.


Cảm ơn. Nếu hai hộp cách ly hoàn toàn với nhau thì sao? Làm thế nào tôi có thể sử dụng đầu ra để so sánh?
Mike B

rsync không hỗ trợ cả nguồn và đích đến từ xa, vì vậy anh ta sẽ cần phải chạy nó khỏi một trong các máy chủ của mình
mạo

@faker: Phải thừa nhận, chưa từng thử điều đó trước đây, tốt để biết. Như bạn nói, mặc dù, nó là đủ dễ dàng để chiếm.
Scott Pack

+1. Khéo léo sử dụng rsync. Tuy nhiên, để hoàn toàn chính xác, bạn cần chạy rsynctheo cả hai hướng. Đó là, bạn cần thêm điều này:rsync -avcn serverb:/opt/foo/ /opt/foo
Steven Thứ Hai

5

Mặc dù bạn có thể hack cùng một tập lệnh nhanh để tính toán các giá trị băm MD5 riêng lẻ cho các tệp riêng lẻ trong một thư mục, cách tốt hơn để làm là sử dụng một công cụ có tên md5deeptính toán đệ quy băm của tất cả các tệp trong một thư mục, sau đó xuất ra chúng vào một tập tin. Sau đó, nó có thể được sử dụng trên một thư mục khác, lấy tệp băm đầu tiên làm đầu vào và cung cấp cho bạn một danh sách các tệp khác nhau giữa hai thư mục.

Vì vậy, lấy ví dụ của bạn, bạn sẽ làm theo quy trình này:

  1. Tính băm của thư mục cần thiết trên Máy chủ A:

    md5deep -r /opt/foo/ > file_hashes.txt

  2. Sao chép tệp tập file_hashes.txttin vào Máy chủ B để so sánh.

  3. Tính băm của thư mục cần thiết trên Máy chủ B, nhưng lấy băm tệp từ Máy chủ A làm tệp đầu vào bằng cách sử dụng -xcờ để chỉ hiển thị các tệp khác nhau:

    md5deep -x file_hashes.txt -r /opt/foo/

Bộ công cụ md5deep tạo thành một phần của hệ thống quản lý gói của hầu hết các bản phân phối, và điều tuyệt vời là nó hỗ trợ một số thuật toán băm khác nhau, không chỉ MD5. Vì vậy, nếu bạn hoang tưởng về va chạm, bạn có sẵn một số lựa chọn thay thế. Các công cụ sau đây là một phần của md5deep, mỗi công cụ cung cấp một thuật toán băm thay thế:

   md5deep - Compute and compare MD5 message digests
   sha1deep - Compute and compare SHA-1 message digests
   sha256deep - Compute and compare SHA-256 message digests
   tigerdeep - Compute and compare Tiger message digests
   whirlpooldeep - Compute and compare Whirlpool message digests

0

Tôi đã sử dụng một kỹ thuật tương tự như @ scott-pack Điều này sẽ cho bạn sự khác biệt hai chiều. Mọi thứ bắt đầu bằng "xóa" là một tệp nằm trên máy chủ từ xa chứ không phải máy chủ cục bộ. Mỗi thư mục được liệt kê mà không có bất kỳ nội dung tập tin là một không có thay đổi. Mỗi tệp được liệt kê là một tệp không tồn tại trên máy chủ từ xa hoặc phiên bản cục bộ là "mới hơn".

rsync -rvnac --delete /local/directory/ user@remote:/remote/directory/
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.