So sánh các thư mục lớn với báo cáo tiến độ


13

Tôi chỉ rsync-ed 2.000.000 tệp (3TB) từ RAID này sang RAID khác.

Tôi muốn đảm bảo dữ liệu của tôi còn nguyên vẹn.

rsync -c mất một thời gian thực sự dài

diff không cho tôi thấy những gì nó đang làm.

Có một sự thay thế nào (a) nhanh hơn và (b) sẽ cho tôi thấy sự tiến bộ trong khi nó đang so sánh?

(Tôi đang dùng Mac và brew search diffđưa cho tôi apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ... một trong số này có thực hiện được không?)



Tôi cũng bối rối không hiểu tại rsyncsao sao chép dữ liệu với tốc độ khoảng 150 MB / giây, nhưng diffso sánh chỉ ở mức 60 MB / giây ...?
Dan

1
Bản sao sử dụng rsyncnhanh hơn b / c rsynctheo mặc định không sử dụng tổng kiểm tra để so sánh các tệp, nó xem kích thước và thông tin ngày. Khi bạn sử dụng rsync -ctất cả các tệp cần phải tính toán tổng kiểm tra của chúng, đây là một nhiệm vụ nặng nề, do đó tại sao nó không phải là mặc định.
slm

Có, nhưng diff không sao chép ... nó chỉ đọc cả hai tập tin; trong khi rsync, để sao chép, phải đọc từng byte, sau đó viết nó. Đây là một rsync từ đầu, vì vậy nó đã sao chép mọi tệp.
Dan

Câu trả lời:


6

chỉnh sửa để chỉnh sửa & tùy chọn rõ ràng - Tôi quên '--brief'

diff -rs --brief "$dir1" "$dir2" 

-r, --recursive              recursively compare any subdirectories found
-s, --report-identical-files report when two files are the same
-q, --brief                  report only when files differ
--speed-large-files      assume large files and many scattered small changes

và thêm các tùy chọn khác để nếm thử, tùy thuộc vào những gì bạn đang so sánh:

-i, --ignore-case            ignore case differences in file contents
-b, --ignore-space-change    ignore changes in the amount of white space
-B, --ignore-blank-lines     ignore changes whose lines are all blank
--strip-trailing-cr      strip trailing carriage return on input
--ignore-file-name-case  ignore case when comparing file names

diff -rs sẽ đọc từng byte của bản gốc và bản sao và các tệp báo cáo giống nhau.

Định dạng đầu ra khác được định nghĩa bởi POSIX, vì vậy nó khá dễ mang theo. Bạn có thể muốn thêm một cái gì đó như:

| tee khác nhau.1 | grep -v -Ee 'Tệp. * và. * giống hệt nhau'

Bạn có thể sử dụng chksums hoặc băm, nhưng sau đó bạn phải giữ chúng đồng bộ hóa với các cây tệp, vì vậy dù sao bạn cũng sẽ quay lại để đọc từng byte của mỗi tệp.

EDIT - quá dài để trở thành một nhận xét, để đáp lại:

các tệp trên 10 GB không được xác minh

Bạn có thể muốn thử tùy chọn khác này: - tệp tốc độ lớn

Có thể là khác biệt bạn đang sử dụng không đối phó tốt với các tệp rất lớn (ví dụ lớn hơn bộ nhớ hệ thống) và do đó báo cáo sự khác biệt giữa các tệp thực sự giống nhau.

Tôi đã nghĩ rằng có một tùy chọn -h hoặc 'bdiff' hoạt động tốt hơn trên các tệp lớn, nhưng tôi không thể tìm thấy tùy chọn nào trong Fedora. Tôi tin rằng các tùy chọn --speed-tệp lớn là sự kế thừa cho tùy chọn "so sánh nửa vời".

Một cách tiếp cận khác sẽ là lặp lại lệnh rsync mà bạn đã sử dụng, với '-vin' (verbose, itemize, no_run). Điều này sẽ báo cáo bất kỳ sự khác biệt nào mà rsync tìm thấy - và không nên có bất kỳ sự khác biệt nào.

Để di chuyển một số tệp, bạn đang xem một tập lệnh như:

if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then 
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv  "$dir2/$path" "$target"
fi

nhưng tôi không khuyên bạn nên làm điều đó. Câu hỏi cơ bản là "làm thế nào tôi có thể chắc chắn rằng rsync sao chép chính xác hệ thống phân cấp tệp?" và nếu bạn có thể tự chứng minh rằng rsync đang hoạt động tốt, với diff hoặc một số công cụ khác, thì bạn chỉ có thể dựa vào rsync, thay vì làm việc xung quanh nó.

rsync -vin sẽ so sánh dựa trên bất kỳ tùy chọn nào khác mà bạn cung cấp cho nó. Tôi nghĩ rằng nó được mặc định là tổng kiểm tra, nhưng bạn đã đúng, -c hoặc --checksum là bắt buộc cho điều đó.

Tiện ích diff thực sự dành cho các tệp của dòng văn bản, nhưng nó phải báo cáo "giống hệt" cho các tệp nhị phân.

--Brief nên chặn bất kỳ đầu ra nội dung tệp nào - lời xin lỗi của tôi vì đã xem trước đó - nó đã bị chôn vùi trong một tập lệnh xấu xí.


Có cách nào để đưa nó vào mvmọi tệp mà nó tìm thấy vào thư mục "đã xác minh" ở thư mục gốc của ổ đĩa, giữ nguyên đường dẫn đầy đủ không? Ví dụ, nếu /disk1/a/b/c/file1giống hệt /disk2/a/b/c/file1, sau đó di chuyển nó đến /disk1/verified/a/b/c/file1. Sau đó, tôi có thể kết thúc chỉ với các tập tin sao chép xấu. (Cho đến nay RẤT NHIỀU tệp trên 10 GB không được xác minh, điều này thật đáng sợ.)
Dan

Bạn có thể muốn thử tùy chọn này: - tệp tốc độ lớn
D McKeon

Điều đó làm gì chính xác?
Dan

Nếu tôi chạy rsync -vin- điều đó có thực hiện so sánh từng byte hoặc tổng kiểm tra không? Tôi nghĩ rsync chỉ so sánh kích thước / ngày trừ khi bạn thêm -c. Và từ những gì tôi đã đọc speed large filesdường như chỉ tạo ra sự khác biệt với các tệp không nhị phân ... hoặc tôi có sai không?
Dan

diffmang lại cho tôi kết quả dưới dạng "Files __ and ___ differ"... và tôi đang chạy qua sed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"để thử và tạo tập lệnh để sao chép lại các tệp xấu. Nhưng đầu ra của diff không được trích dẫn, vì vậy nó không hoạt động. Tôi có thể lấy nó để cho tôi trích dẫn đường dẫn?
Dan

4

Đây là diffbáo cáo tiến độ dựa trên số lượng tập tin:

diff -rqs dir1 dir2 | pv -l -s filecount > logfile

Bạn sẽ cần pv (trình xem ống): http://www.ivarch.com/programs/pv.shtml

Giải trình:

  • diff -r so sánh thư mục và thư mục con đệ quy.
  • diff -qchỉ in tên tệp của các tệp khác nhau. không in sự khác biệt thực tế.
  • diff -sin tên tập tin của các tập tin không khác nhau. điều này rất quan trọng đối với thông tin tiến độ
  • pv -l báo cáo tiến độ dựa trên số lượng dòng.
  • pv -s count ước tính thời gian để hoàn thành dựa trên số lượng.
  • Chuyển hướng đến logfilelà cho đầu ra khá. Nếu không, đầu ra từ diffsẽ trộn với dòng trạng thái từ pv.

để lấy số tập tin, sử dụng lệnh sau:

find dir1 -type f | wc -l

Lọc logfile cho các tệp khác nhau:

grep -v "^Files .* identical$" logfile

Biến thể này sẽ in các tệp khác nhau trong thời gian thực đồng thời ghi nhật ký mọi thứ vào logfile:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"

Ngoài ra, bạn chỉ có thể đăng nhập các tệp khác nhau:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile

Lưu ý: các lệnh trên sẽ báo cáo tiến trình dựa trên số lượng tệp. Điều này hoạt động tốt nhất nếu có nhiều tập tin nhỏ. Nếu bạn có một vài tệp lớn thì bạn sẽ không có nhiều niềm vui với điều này.

Đáng buồn là tôi không biết một cách dễ dàng để báo cáo tiến trình dựa trên byte được so sánh.


Nếu bạn có thể tìm thấy sự bình yên của mình chỉ bằng cách so sánh siêu dữ liệu (chứ không phải nội dung thực tế của các tệp) thì bạn có thể sử dụng rsync. Điều này sẽ nhanh hơn đáng kể.

Để biết thêm chi tiết:


0

Tôi sẽ xem xét việc sử dụng một số loại ứng dụng băm để kiểm tra tính toàn vẹn dữ liệu. Tôi biết rằng nhiều tiện ích tìm tệp trùng lặp sử dụng băm để xác định trùng lặp / không trùng lặp. Dường như với tôi rằng đây là một cuộc điều tra có thể đáng giá.


0

Bạn có thể sử dụng sao lưu dự phòng cho điều đó. Cài đặt nó trên cả hai máy chủ và nó sẽ thực hiện so sánh thông minh tổng kiểm tra và đồng bộ hóa những gì chưa có.

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.