Xử lý các tập tin hoặc thư mục được đổi tên trong rsync


26

Tôi đang làm việc trên một rsynckịch bản để sao chép thư mục. Tôi chỉ đồng bộ hóa các tệp hoặc thư mục mới và đã sửa đổi nhưng không thích việc sao chép nó đã đổi tên tệp hoặc thư mục thành tệp hoặc thư mục mới, giữ cho các tệp không đồng bộ. Tôi cũng đã đặt giới hạn băng thông là 1MB vì ​​điều này sẽ chạy trong giờ làm việc. Đây là kịch bản của tôi:

rsync -zvru --bwlimit=1024  /mymounts/test1/ /mymounts/test2

Làm cách nào tôi có thể giữ các tệp và thư mục đồng bộ nếu ai đó đổi tên một cái gì đó, mà vẫn chỉ sao chép các tệp mới hoặc sửa đổi? Dưới đây là các tập tin trong câu hỏi

ls "/mymounts/test1/some stuff"
new directory  newfile1.txt  newfile3.txt  renamedFile.txt

ls "/mymounts/test2/some stuff"
new directory  newfile1.txt  newfile2.txt  newfile3.txt  renamedFile.txt

Hoặc sẽ có một cách để thậm chí di chuyển các tập tin được đổi tên sang thư mục khác nói : /mymounts/VerControl?

Câu trả lời:


23

Bạn có thể xử lý các tệp được di chuyển và đổi tên rsyncnếu các hệ thống tệp trên thư mục nguồn và đích có hỗ trợ cho các liên kết cứng. Ý tưởng là để rsync xây dựng lại các liên kết cứng trước khi chuyển giao thực sự. Bạn có thể tìm thấy một lời giải thích tuyệt vời ở đây .

Chúng tôi đã kết thúc với một giải pháp đơn giản tạo ra một cây ẩn các liên kết cứng bên trong thư mục nguồn / đích, tập lệnh cơ bản có thể như sau:

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

Tôi có một kịch bản ví dụ trên GitHub . Nhưng tôi khuyên bạn nên thực hiện một số lượng lớn thử nghiệm trước khi sử dụng phương pháp này vào sản xuất.


Ngoài ra lời giải thích tuyệt vời của người Viking mà bạn liên kết đến cũng đề cập đến rsyncbài viết cơ bản tuyệt vời này, FWIW. everythinglinux.org/rsync
JakeGould

19

Bạn có thể muốn xem -y | --fuzzytùy chọn rsync. Ngoài ra, rsync không có cách theo dõi đổi tên, vì vậy cuối cùng bạn sẽ chuyển tệp được đổi tên.

Từ trang web rsync:

   -y, --fuzzy
          This option tells rsync that it should look for a basis file for
          any  destination  file  that  is missing.  The current algorithm
          looks in the same directory as the destination file for either a
          file  that  has  an identical size and modified-time, or a simi-
          larly-named file.  If found, rsync uses the fuzzy basis file  to
          try to speed up the transfer.

7
Lưu ý rằng, nếu sử dụng --fuzzy, bạn nên xem xét việc ghép nó với --delete-delay, như "rsync theo mặc định là một --delete-before, do đó loại bỏ tệp cơ sở trước khi có thể sao chép / di chuyển" . Nguồn: Sonia Hamilton
Ronan Jouchet

1

Bạn không thể.

Rsync có ba chế độ,

  • Sao chép tất cả các tập tin
  • Sao chép các tệp hiện có (đã sửa đổi / không sửa đổi) - trên này bạn có nhiều tùy chọn
  • Sao chép các tập tin không tồn tại.

Tuy nhiên, ba chế độ này có hai loại phụ,

  • Không bao gồm
  • Bao gồm trên

Rsync không theo dõi tập tin nào được đổi tên, nó không có trạng thái. Thay vào đó, hãy xem xét sao chép tất cả các tệp và loại trừ những tệp bạn không muốn. Bạn không thể có một danh sách trắng thay đổi, bạn có thể có một danh sách đen.

rsync [..stuff..] --exclude 'lib/'

gotcha cảm ơn cho đầu vào sẽ phải sống với các tập tin được đổi tên sau đó.
jmituzas

Bạn có thể xóa nó khỏi các tập tin không tồn tại, điều đó hoàn toàn tốt. Nhưng là một chức năng của sao chép, nếu bạn đổi tên trên nguồn, nó sẽ sao chép tệp đã đổi tên.
Evan Carroll

Tôi có thể giữ các phiên bản với -b và đặt hậu tố = date +%Y%m%d%k%M%Sdù sao tôi có thể nhận được hậu tố = date +%Y%m%d%k%M%S.ORIGINALSUFFIX?
jmituzas

0

Theo tôi biết, rsynckhông thể nhận ra việc đổi tên tập tin Các tập tin mới sẽ phải chuyển lại. Xem câu trả lời của artyom .

Để xóa các tập tin đã mất, đảm bảo sử dụng --deletetùy chọn.

Ngoài ra, để phản chiếu, tôi khuyên bạn nên sử dụng -a( lưu trữ ), trong đó có một số tùy chọn tốt.

Có một cái nhìn vào man 1 rsyncđể biết chi tiết.


cảm ơn sẽ hoạt động --delete / mymounts / test1 / / mymounts / test2 /
jmituzas
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.