Một thời gian trở lại đây, tôi cần hiểu rsync
đầu ra cho một kịch bản mà tôi đang viết. Trong quá trình viết script đó, tôi đã tìm kiếm xung quanh và tìm đến những gì @mit đã viết ở trên . Tôi đã sử dụng thông tin đó, cũng như tài liệu từ các nguồn khác, để tạo mồi của riêng tôi về cờ bit và cách lấy rsync
cờ bit đầu ra cho tất cả các hành động (nó không thực hiện điều này theo mặc định).
Tôi đăng thông tin đó ở đây với hy vọng rằng nó sẽ giúp những người khác (như tôi) tình cờ tìm kiếm được trên trang này và cần được giải thích rõ hơn rsync
.
Với sự kết hợp của --itemize-changes
lá cờ và những -vvv
lá cờ, rsync
cho chúng ta kết quả chi tiết của tất cả các thay đổi hệ thống tập tin đó đã được xác định trong thư mục nguồn khi so sánh với các thư mục đích. Các cờ bit được tạo ra rsync
sau đó có thể được giải mã để xác định những gì đã thay đổi. Để giải mã ý nghĩa của từng bit, hãy sử dụng bảng sau.
Giải thích về vị trí và giá trị của từng bit trong rsync
đầu ra của:
YXcstpoguax path/to/file
|||||||||||
||||||||||╰- x: The extended attribute information changed
|||||||||╰-- a: The ACL information changed
||||||||╰--- u: The u slot is reserved for future use
|||||||╰---- g: Group is different
||||||╰----- o: Owner is different
|||||╰------ p: Permission are different
||||╰------- t: Modification time is different
|||╰-------- s: Size is different
||╰--------- c: Different checksum (for regular files), or
|| changed value (for symlinks, devices, and special files)
|╰---------- the file type:
| f: for a file,
| d: for a directory,
| L: for a symlink,
| D: for a device,
| S: for a special file (e.g. named sockets and fifos)
╰----------- the type of update being done::
<: file is being transferred to the remote host (sent)
>: file is being transferred to the local host (received)
c: local change/creation for the item, such as:
- the creation of a directory
- the changing of a symlink,
- etc.
h: the item is a hard link to another item (requires
--hard-links).
.: the item is not being updated (though it might have
attributes that are being modified)
*: means that the rest of the itemized-output area contains
a message (e.g. "deleting")
Một số ví dụ đầu ra từ rsync cho các tình huống khác nhau:
>f+++++++++ some/dir/new-file.txt
.f....og..x some/dir/existing-file-with-changed-owner-and-group.txt
.f........x some/dir/existing-file-with-changed-unnamed-attribute.txt
>f...p....x some/dir/existing-file-with-changed-permissions.txt
>f..t..g..x some/dir/existing-file-with-changed-time-and-group.txt
>f.s......x some/dir/existing-file-with-changed-size.txt
>f.st.....x some/dir/existing-file-with-changed-size-and-time-stamp.txt
cd+++++++++ some/dir/new-directory/
.d....og... some/dir/existing-directory-with-changed-owner-and-group/
.d..t...... some/dir/existing-directory-with-different-time-stamp/
Bắt rsync
đầu ra của (tập trung vào các cờ bit):
Trong thử nghiệm của tôi, cả hai --itemize-changes
lá cờ và những -vvv
lá cờ là cần thiết để có được rsync
đầu ra một mục nhập cho tất cả các thay đổi hệ thống tập tin. Nếu không có -vvv
cờ ba tiết ( ), tôi không thấy các thay đổi về thư mục, liên kết và thiết bị được liệt kê. Bạn nên thử nghiệm với phiên bản rsync của mình để đảm bảo rằng nó đang quan sát và ghi nhận tất cả những gì bạn mong đợi.
Một cách sử dụng hữu ích của kỹ thuật này là thêm --dry-run
cờ vào lệnh và thu thập danh sách thay đổi, như được xác định bởi rsync, vào một biến (mà không cần thực hiện bất kỳ thay đổi nào) để bạn có thể tự thực hiện một số xử lý trên danh sách. Một cái gì đó như sau sẽ nắm bắt đầu ra trong một biến:
file_system_changes=$(rsync --archive --acls --xattrs \
--checksum --dry-run \
--itemize-changes -vvv \
"/some/source-path/" \
"/some/destination-path/" \
| grep -E '^(\.|>|<|c|h|\*).......... .')
Trong ví dụ trên, đầu ra (stdout) từ rsync
được chuyển hướng đến grep
(thông qua stdin) để chúng ta chỉ có thể cô lập các dòng có chứa cờ bit.
Xử lý đầu ra đã chụp:
Nội dung của biến sau đó có thể được ghi lại để sử dụng sau này hoặc ngay lập tức được lặp lại cho các mục quan tâm. Tôi sử dụng chiến thuật chính xác này trong kịch bản tôi đã viết trong quá trình nghiên cứu thêm rsync
. Bạn có thể xem script ( https://github.com/jmmitchell/movestough ) để biết các ví dụ về xử lý hậu kỳ đầu ra đã chụp để cô lập các tệp mới, các tệp trùng lặp (cùng tên, cùng nội dung), xung đột tệp (cùng tên, khác nội dung), cũng như những thay đổi trong cấu trúc thư mục con.