Làm thế nào chính xác rsync quyết định những gì để đồng bộ hóa?


14

Tôi đang tìm nhiều câu trả lời cho câu hỏi, vì vậy muốn hỏi những người thực sự sử dụng nó, thay vì chỉ muốn tạo blog lớn nhất bằng cách điền thông tin bán vô dụng ngẫu nhiên.

Kịch bản: Tôi rsync -av --progress /dir/a /dir/b và nó làm việc của nó.

Tôi thêm các tệp mới vào / dir / a và chạy lại cùng một lệnh, nó biết nó đã làm gì và chỉ sao chép các tệp mới.

Tôi thêm các tệp mới vào / dir / a và đổi tên một số tệp trong / dir / b và cũng có thể xóa một vài tệp.

Nếu tôi chạy rsync -av --progress /dir/a /dir/blại, cái gì sẽ được sao chép? Chỉ các tệp mới vì nó biết những gì nó đã sao chép trước đó hoặc các tệp đã được đổi tên / xóa, vì chúng không còn tồn tại.

Và như một phần thưởng, nếu các tệp được sao chép trước đó được sao chép lại, có cách nào để ngăn chặn điều đó, để chỉ những bổ sung mới cho / dir / a được sao chép?

Hiện tại tôi rất vui khi kiểm tra mọi thứ bằng tay, nhưng khi dữ liệu trở nên lớn hơn, tôi sẽ cần tự động hóa nhiều hơn để thực hiện nhiệm vụ này.


3
Các -ilá cờ là rất tiện dụng. Đối với mỗi tệp, nó cung cấp một chuỗi khớp có thể được giải mã để xem lý do tại sao nó khớp (cờ cho thời gian mod, cờ cho kích thước, v.v.)
BowlOfRed

Câu trả lời:


17

Tôi thêm các tệp mới vào / dir / a và chạy lại cùng một lệnh, nó biết nó đã làm gì và chỉ sao chép các tệp mới.

Không, nó không biết những gì nó đã làm trong lần chạy trước. Nó so sánh dữ liệu ở phía nhận với dữ liệu được gửi. Với dữ liệu đủ nhỏ, điều này sẽ không rõ ràng, nhưng khi bạn có các thư mục đủ lớn, thời gian so sánh trước khi sao chép thực sự bắt đầu dễ dàng cảm thấy.

Kiểm tra mặc định là cho thời gian sửa đổi và kích thước tập tin. Từ man rsync:

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

Và:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

Lưu ý rằng những điều này không được ngụ ý bởi các tùy chọn bạn đã sử dụng. -aLà:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times

Mô tả hay nhất tôi từng thấy (cho đến nay), cảm ơn bạn
SPooKYiNeSS

2
Một chút bổ sung. Các tệp được đổi tên được coi là các tệp duy nhất ở hai đầu. Chỉ định --fuzzymột lần sẽ nhận ra chúng là giống nhau trong cùng một thư mục. Sử dụng --fuzzyhai lần mở rộng khả năng này đến các vị trí khác. Xem man rsyncđể biết chi tiết. Tất nhiên, một trong những lý do chính để sử dụng rsynclà khả năng sao chép chỉ các phần của tệp đã thay đổi. Điều này có thể thực hiện chuyển tiền qua mạng nhanh hơn nhiều. BTW, tùy chọn tổng kiểm tra được đề cập ở trên để giải thích về cách thức rsynchoạt động. Trong hầu hết các trường hợp, nó không nên được sử dụng.
Joe

6

Chung

Nếu tôi hiểu chính xác, rsync -avkhông có bộ nhớ, vì vậy nó cũng sẽ sao chép các tệp đã được đổi tên / xóa, vì chúng có trong nguồn nhưng không còn hiện diện trong mục tiêu.

Lời khuyên

  • Sử dụng tùy chọn -n, 'chạy khô', để kiểm tra những gì xảy ra trước khi bạn chạy rsyncdòng lệnh của mình .

  • Lưu ý ý nghĩa đặc biệt của dấu gạch chéo sau thư mục nguồn và xem sự khác biệt giữa

    rsync -av --progress dir/a/ dir/b
    

    rsync -av --progress dir/a dir/b
    

    được mô tả trong hướng dẫn man rsync.

Thí dụ

Trường hợp đặc biệt của bạn (thêm tệp vào thư mục nguồn 'a' và xóa tệp khỏi thư mục đích 'b') sẽ thêm cả tệp đã thêm và tệp đã sao chép trước đó, vì nó vẫn nằm trong thư mục nguồn. Điều này sẽ xảy ra cả có và không có tùy chọn -uvà tôi không biết bất kỳ tùy chọn nào rsyncđể khắc phục điều đó một cách dễ dàng, nếu bạn muốn giữ nó trong thư mục nguồn.

Nhưng bạn có thể xóa nó khỏi thư mục nguồn hoặc đặt tên tệp vào tệp excludedvà sử dụng tùy chọn --exclude-from=excluded(cho nhiều tệp) hoặc đơn giản --exclude=PATTERNcho một hoặc một vài tệp.

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

Thay thế: unison

Bạn có thể muốn kiểm tra công cụ unison, đây là một công cụ đồng bộ hóa . Nó cung cấp một phương pháp trực quan để xác định các trường hợp đặc biệt và quyết định phải làm gì. Có phiên bản GUI ( unison-gtk).


Ví dụ tốt đẹp cảm ơn. Tôi đã biết / cuối cùng, tôi chỉ hỏi điều này từ ứng dụng và đã bỏ lỡ nó (và bạn có thể thấy rõ tôi vừa sao chép / đăng
SPooKYiNeSS

Và một lần nữa nó sẽ gửi trước khi tôi hoàn thành và sẽ không để tôi chỉnh sửa nhận xét của mình ... Sao chép / dán cái thứ hai. Tôi sẽ xem unuson và xem liệu nó có thể làm những gì tôi muốn không, và nếu không tôi sẽ quay lại kế hoạch b và chỉ cần tạo một kịch bản
SPooKYiNeSS

Tôi đã sử dụng unison-gtktrong nhiều năm, và tôi hài lòng với nó. (Tôi cũng sử dụng rsync.)
sudodus

1

Nó chỉ sao chép các tập tin mới trong / dir / a. Bất cứ điều gì bạn làm trong / dir / b sẽ bị bỏ qua, trừ khi bạn sử dụng tùy chọn --delete. Trong trường hợp đó, các tên được đổi tên trong / dir / b sẽ bị xóa. Nó sẽ buộc / dir / b trở nên chính xác như / dir / a.

Về phần thưởng, bạn có ý như thế nào trong trường hợp đổi tên tập tin trong / dir / a, và sau đó rsyncing thành / dir / b? Tôi không nghĩ có một cách để ngăn rsync chỉ sao chép lại các tệp trong trường hợp đó.


Tôi không mong đợi có một cách, ngoài việc sử dụng một thuộc tính để xác định, nhưng sau đó nếu được tạo một kịch bản trẻ con và sẽ có nhu cầu nữa. Cảm ơn câu trả lời của bạn mặc dù, ít nhất bây giờ tôi biết tôi cần phải làm gì.
SPooKYiNeSS
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.