Tại sao rsync cố gắng sao chép tệp đã được cập nhật?


24

Tôi có hai tệp giống nhau, trên máy cục bộ và trên một tệp từ xa. Kích thước của chúng bằng nhau và tệp trên máy cục bộ mới hơn so với trên máy từ xa - nhưng rsync vẫn cố gắng sao chép tệp.

Tôi gọi rsync như sau:

rsync -nv -e "ssh -p 2222" user@host:/data/file.fif data/file.fif

(nếu tôi không sử dụng -ntùy chọn, nó sẽ bắt đầu thao tác sao chép)

Các tài liệu của Rsync tuyên bố rõ ràng rằng điều đó không nên xảy ra:

Rsync  finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time.

Đầu ra từ stat:

# remote file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221784    IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 286338      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1037/  platon)   Gid: ( 1047/  platon)
Access: 2013-08-08 18:40:16.907581658 +0400
Modify: 2013-07-16 12:01:09.158763284 +0400
Change: 2013-07-16 12:01:09.158763284 +0400

# local file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221792    IO Block: 4096   regular file
Device: 801h/2049d  Inode: 12987232    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1005/  platon)   Gid: ( 1003/  platon)
Access: 2013-08-08 19:02:57.146223369 +0400
Modify: 2013-08-08 19:02:57.146223369 +0400
Change: 2013-08-08 19:02:57.146223369 +0400

Lý do tại sao điều này xảy ra?

CẬP NHẬT:

Làm rsync --size-onlytập tin kết quả không được sao chép:

delta-transmission enabled
Skovorodko_Olga_45_raw.fif is uptodate
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 14 bytes  received 114 bytes  85.33 bytes/sec
total size is 1137551966  speedup is 8887124.73 (DRY RUN)

Câu trả lời:


37

Thuật toán kiểm tra nhanh sẽ xem xét như đã sửa đổi bất kỳ tệp nào có thời gian sửa đổi khác nhau hoặc kích thước khác nhau. Vì vậy, nếu thư mục đích của bạn có phiên bản mới hơn của cùng một tệp, nó sẽ được coi là khác nhau và nó sẽ được đồng bộ hóa với phiên bản nguồn.

Đó là hành vi dự kiến ​​(và an toàn hơn). Chẳng hạn, giả sử bạn có hai thư mục, ~ / src và ~ / Dest, mỗi thư mục có tệp foobar. Trong ~ / src / foobar bạn viết "foo", và sau đó trong ~ / Dest / foobar bạn viết "bar". Bây giờ bạn rsync ~ / src thành ~ / mệnh. Bạn mong đợi điều gì?

Cả hai tệp có cùng kích thước, nhưng tệp trong ~ / mệnh mới hơn. Hành vi tiêu chuẩn của Rsync là thay thế ~ / Dest / foobar bằng ~ / src / foobar. Tất nhiên, các tệp có thể giống hệt nhau và nó sẽ không cần thiết, nhưng không có cách nào để biết điều đó, trừ khi bạn thực hiện kiểm tra hoặc so sánh bit trên mỗi bit.

Nếu bạn không muốn hành vi đó, nghĩa là, bạn muốn các tệp mới hơn trong bộ thu được bảo toàn, bạn phải sử dụng cờ -u (--update).

-u, --update Điều này buộc rsync bỏ qua mọi tệp tồn tại trên đích và có thời gian sửa đổi mới hơn tệp nguồn. (Nếu một tệp đích hiện có thời gian sửa đổi bằng với tệp nguồn, nó sẽ được cập nhật nếu kích thước khác nhau.)


2
Vâng, đó thực sự là vấn đề. Tôi đã quên thêm -tcờ, vì vậy nó không đặt thời gian sửa đổi thích hợp cho tệp mới và các yêu cầu rsync tiếp theo đang cố cập nhật tệp mới hơn. Cảm ơn!
Rogach

13
@Rogach Luôn luôn sử dụng rsync -atrừ khi bạn có lý do chính đáng để không.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đã gặp vấn đề tương tự của OP nhưng -atrong trường hợp này sẽ dẫn đến một vấn đề khác, cụ thể là lỗi skipping directory .Nguyên nhân là do -a-rvà tôi nghĩ rằng nếu không có thư mục nào trong thư mục thì nó sẽ báo lỗi đó. Được thảo luận trong bài đăng trên blog này
thảo quả

@cardamom Một người vẫn nên sử dụng -atheo mặc định, và sau đó vô hiệu hóa bất kỳ tùy chọn nào mà nó bao gồm mà bạn không muốn, với --no-tiền tố. Trong trường hợp của bạn, nó sẽ được rsync -a --no-r.
Walf
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.