rsync: sự khác biệt giữa --size-only và --ignore-times


114

Tôi đang cố gắng hiểu sự khác biệt giữa hai lựa chọn là gì

rsync --size-only

rsync --ignore-times

Tôi hiểu rằng theo mặc định, rsync sẽ so sánh cả dấu thời gian và kích thước tệp để quyết định xem tệp có nên được đồng bộ hóa hay không. Các tùy chọn trên cho phép người dùng tác động đến hành vi này.

Cả hai lựa chọn dường như, ít nhất là bằng lời nói để dẫn đến cùng một điều: chỉ so sánh theo kích thước .

Tôi có thiếu một cái gì đó tinh tế ở đây?


18
Điều này có thể sẽ phù hợp hơn trên một cái gì đó như SuperUser.com hoặc Unix.SE , vì nó là về việc sử dụng một công cụ hiện có (không liên quan đến lập trình) hơn là bất cứ thứ gì liên quan trực tiếp đến việc viết mã.
Jerry Coffin

Câu trả lời:


110

Có một số cách rsync so sánh các tệp - nguồn có thẩm quyền là mô tả thuật toán rsync: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf . Các bài viết wikipedia trên rsync cũng rất tốt.

Đối với các tệp cục bộ, rsync so sánh siêu dữ liệu và nếu có vẻ như nó không cần sao chép tệp vì kích thước và dấu thời gian khớp giữa nguồn và đích thì nó không nhìn xa hơn. Nếu chúng không khớp, thì cp là tệp. Tuy nhiên, điều gì sẽ xảy ra nếu siêu dữ liệu khớp nhưng các tệp không thực sự giống nhau? Sau đó, rsync có thể đã không làm những gì bạn dự định.

Các tệp có cùng kích thước vẫn có thể đã thay đổi. Một ví dụ đơn giản là tệp văn bản nơi bạn sửa lỗi chính tả - như thay đổi "teh" thành "the". Kích thước tệp giống nhau, nhưng tệp đã sửa sẽ có dấu thời gian mới hơn. --size-onlynói "không nhìn vào thời gian; nếu kích thước phù hợp, giả sử các tệp phù hợp", đó sẽ là lựa chọn sai trong trường hợp này.

Mặt khác, giả sử bạn vô tình làm một việc lớn cp -r A Bngày hôm qua, nhưng bạn quên bảo quản các dấu thời gian, và bây giờ bạn muốn thực hiện thao tác ngược lại rsync B A. Tất cả các tệp bạn đã tạo đều có dấu thời gian của ngày hôm qua, mặc dù chúng không thực sự được sửa đổi vào ngày hôm qua và theo mặc định, rsync sẽ kết thúc việc sao chép tất cả các tệp đó và cập nhật dấu thời gian cho ngày hôm qua. --size-onlycó thể là bạn của bạn trong trường hợp này (mô-đun ví dụ ở trên).

--ignore-timesnói để so sánh các tệp bất kể các tệp có cùng thời gian sửa đổi hay không. Hãy xem xét ví dụ về lỗi đánh máy ở trên, nhưng sau đó bạn không chỉ sửa lỗi chính tả mà còn touchlàm cho tệp đã sửa có cùng thời gian sửa đổi với tệp gốc - giả sử bạn đang lén lút theo cách đó. Vâng --ignore-timessẽ làm một diff của các tập tin mặc dù kích thước và thời gian trận đấu.


58

Câu trả lời ngắn gọn là nó --ignore-timeslàm được nhiều hơn tên của nó. Nó bỏ qua cả thời gian và kích thước. Ngược lại, --size-onlylàm chính xác những gì nó nói.


Câu trả lời dài là rsynccó ba cách để quyết định xem tệp có lỗi thời hay không:

  1. So sánh kích thước của nguồn và đích.
  2. So sánh dấu thời gian của nguồn và đích.
  3. So sánh tổng kiểm tra tĩnh của nguồn và đích.

Các kiểm tra này được thực hiện trước khi chuyển dữ liệu. Đáng chú ý, điều này có nghĩa là tổng kiểm tra tĩnh khác biệt với tổng kiểm tra luồng - sau này được tính toán trong khi truyền dữ liệu.

Theo mặc định, rsyncchỉ sử dụng 1 và 2. Cả 1 và 2 có thể được mua cùng nhau bởi một cái duy nhất stat, trong khi 3 yêu cầu đọc toàn bộ tệp (điều này độc lập với việc đọc tệp để chuyển). Giả sử chỉ có một công cụ sửa đổi được chỉ định, điều đó có nghĩa là:

  • Bằng cách sử dụng --size-only, chỉ 1 được thực hiện - dấu thời gian và tổng kiểm tra bị bỏ qua. Một tệp được sao chép trừ khi kích thước của nó giống nhau ở cả hai đầu.

  • Bằng cách sử dụng --ignore-times, cả 1, 2 hoặc 3 đều không được thực hiện. Một tệp luôn được sao chép.

  • Bằng cách sử dụng --checksum, 3 được sử dụng ngoài 1, nhưng 2 không được thực hiện. Một tệp được sao chép trừ khi kích thước và tổng kiểm trùng khớp. Tổng kiểm tra chỉ được tính nếu kích thước khớp.


1
--checksum chính xác là những gì tôi đang tìm kiếm. Tôi đang sao chép đầu ra bản dựng chỉ có thay đổi thời gian cho hầu hết các tệp. Thêm --checksum có nghĩa là nó bỏ qua sự khác biệt về thời gian nhưng đảm bảo rằng chúng giống hệt nhau từng chút một. Đó là những gì tôi mong đợi - rất nhiều lần để làm như vậy, cảm ơn bạn đã cung cấp thêm thông tin.
Joseph Connolly

50

Bạn đang thiếu rằng rsync cũng có thể so sánh các tệp bằng tổng kiểm tra.

--size-onlynghĩa là rsync sẽ bỏ qua các tệp phù hợp với kích thước, ngay cả khi dấu thời gian khác nhau. Điều này có nghĩa là nó sẽ đồng bộ hóa ít tệp hơn hành vi mặc định. Nó sẽ bỏ lỡ bất kỳ tệp nào có các thay đổi không ảnh hưởng đến kích thước tệp chung. Nếu bạn có thứ gì đó thay đổi ngày tháng trên tệp mà không thay đổi tệp và bạn không muốn rsync mất nhiều thời gian kiểm tra tổng số các tệp đó để phát hiện ra chúng không thay đổi, thì đây là tùy chọn để sử dụng.

--ignore-timescó nghĩa là rsync sẽ kiểm tra mọi tệp, ngay cả khi dấu thời gian và kích thước tệp khớp nhau. Điều này có nghĩa là nó sẽ đồng bộ hóa nhiều tệp hơn hành vi mặc định. Nó sẽ bao gồm các thay đổi đối với tệp ngay cả khi kích thước tệp giống nhau và ngày / giờ sửa đổi đã được đặt lại về giá trị ban đầu. Kiểm tra tất cả các tệp có nghĩa là nó phải được đọc hoàn toàn từ đĩa, điều này có thể chậm. Một số đường ống xây dựng sẽ đặt lại dấu thời gian thành một ngày cụ thể (như 1970-01-01) để đảm bảo rằng tệp xây dựng cuối cùng có thể tái tạo từng bit, ví dụ: khi được đóng gói thành tệp tar để lưu dấu thời gian.


4
"Đặt lại ngày / giờ khó có thể được thực hiện trong thực tế, nhưng nó có thể xảy ra" - Ví dụ: khi sử dụng phần mềm, nhân danh các bản dựng có thể tái tạo, buộc phải đặt lại mọi tệp về 1970-01-01 thay vì ngày và thời gian tạo / sửa đổi thực tế.

10
Trên thực tế, tôi nghĩ rằng bạn cần tùy chọn -c nếu bạn muốn sử dụng tổng kiểm tra. Nếu không có nó, --ignore-times sẽ sao chép tất cả các tệp vô điều kiện.
Edward Falk

1
Tùy chọn -a có thể ghi đè các tùy chọn này. Trong trường hợp của tôi, tôi đã sử dụng --compare-dir = và --size-only và nhận được kết quả không mong đợi. Thay đổi -a thành -r đã giải quyết được vấn đề.
dbagnara

@dbagnara Hôm nay tôi đã xác nhận rằng --size-only "nằm trên đầu" -a, hoặc "ghi đè" -a. Tôi đã có một ổ đĩa mà vì bất kỳ lý do gì được gắn với tất cả các lần sửa đổi đều tăng lên một tháng. Rsync để sao lưu đang sao chép mọi tệp (với -a BẬT). Thêm --size-only đã khắc phục sự cố và dẫn đến kết quả mong muốn (so -a --size-only). Vì vậy, tôi kết luận rằng chỉ kích thước ghi đè kho lưu trữ.
Tommy

1

Trên hệ thống Scientific Linux 6.7, trang người dùng trên rsync cho biết:

--ignore-times          don't skip files that match size and time

Tôi có hai tệp có nội dung giống hệt nhau, nhưng có ngày tạo khác nhau:

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

Với --size-only, hai tệp được coi là giống nhau:

[root@windstorm ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

Với --ignore-times, hai tệp được coi là khác nhau:

[root@windstorm ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

Vì vậy, nó không giống như --ignore-timescó bất kỳ hiệu ứng nào cả.


2
--ignore-timessẽ sao chép các tệp ngay cả khi dấu thời gian của chúng giống nhau.
MisterMiyagi
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.