2011-10-12 23 views
8

Có thể định cấu hình Rsync để xác minh nội dung của tệp trước khi chúng được đồng bộ hóa hay không. Tôi đã nghe nói về tổng kiểm tra, nhưng tôi đã biết rằng tổng kiểm tra chỉ lấy mẫu. Tôi muốn chuyển một tập tin chỉ khi nó là nội dung được thay đổi và không dấu thời gian, là có một cách để làm điều đó với bất kỳ các chế độ rsync. Trong kịch bản của tôi, hãy nói tệp sample.text sẽ được tạo mỗi tuần và tôi muốn đồng bộ hóa nó với máy chủ từ xa chỉ khi nội dung của sample.text được thay đổi, vì nó được tạo mỗi tuần, dấu thời gian rõ ràng sẽ thay đổi. Nhưng tôi chỉ muốn chuyển đổi về thay đổi nội dung.Có thể rsync xác minh nội dung trước khi đồng bộ hóa

+0

bạn đã thử man page của rsync? -c, --checksum Điều này thay đổi cách rsync kiểm tra xem các tệp đã được thay đổi và cần chuyển khoản hay chưa. Nếu không có tùy chọn này, rsync sử dụng "kiểm tra nhanh" (theo mặc định) sẽ kiểm tra kích thước và thời gian sửa đổi cuối cùng của mỗi tệp giữa người gửi và người nhận. –

Trả lời

23

Có, bạn nên đọc hướng dẫn sử dụng.

$ man rsync | grep "\--checksum" 
    -c, --checksum    skip based on checksum, not mod-time & size 

Rsync khá phức tạp. Tôi khuyên bạn nên ôm ấp thời gian với trang người đàn ông và thử nghiệm với dữ liệu thử nghiệm trước khi sử dụng nó cho bất kỳ điều gì quan trọng từ xa.

Hầu hết thời gian, mọi người sử dụng rsync -ac source dest.

$ man rsync | grep "\--archive" 
-a, --archive    archive mode; same as -rlptgoD (no -H) 

Và đó -rlptgoD rác có nghĩa là: recursive, copy symlinks as symlinks, preserve permissions, preserve times, preserve group, preserve owner, preserve device files (super-user only), preserve special files, và skip based on checksum, not mod-time & size

Các -c hoặc --checksum thực sự là những gì bạn đang tìm kiếm, và giả thiết của bạn rằng nó chỉ mẫu mtime và kích thước là sai.

+3

+ cho _cuddle thời gian với trang người đàn ông và thử nghiệm với dữ liệu thử nghiệm_ - Lời khuyên cực kỳ tốt –

8

Xem tùy chọn --checksum trên trang người rsync.

Ngoài ra, tùy chọn --size-only sẽ là lựa chọn nhanh hơn nếu bạn biết chắc chắn rằng thay đổi nội dung cũng có nghĩa là thay đổi kích thước.

0

Ví dụ:

#!/bin/bash 
echo > diff.txt 
rsync -rvcn --delete /source/ /destination/ > diff.txt 
second_row=$(sed -n '2p' diff.txt) 
if [ "$second_row" = "" ]; then 
    echo there was no change 
else 
    echo there was change 
fi 
+1

Bạn thực sự cần thêm một số giải thích về lý do mã này hoạt động - bạn cũng có thể thêm nhận xét trong chính mã đó - ở dạng hiện tại của nó không cung cấp bất kỳ lời giải thích nào có thể giúp phần còn lại của cộng đồng hiểu những gì bạn đã làm để giải quyết/trả lời câu hỏi. – ishmaelMakitla

+0

Nếu không có thay đổi dòng thứ hai của diff.txt trong chế độ tiết của rsync trống, sed kiểm tra dòng thứ hai này. – oldbowman

Các vấn đề liên quan