ในบางครั้งฉันต้องเข้าใจrsync
ผลลัพธ์ของสคริปต์ที่ฉันเขียน ในระหว่างขั้นตอนของการเขียนสคริปต์ที่ฉัน googled รอบและมาถึงสิ่งที่ @mit ได้เขียนข้างต้น ฉันใช้ข้อมูลดังกล่าวตลอดจนเอกสารประกอบจากแหล่งอื่นเพื่อสร้างไพรเมอร์ของฉันเองบนแฟล็กบิตและวิธีรับrsync
แฟล็กบิตเอาต์พุตสำหรับการกระทำทั้งหมด (ไม่ได้ทำตามค่าเริ่มต้น)
ฉันโพสต์ข้อมูลไว้ที่นี่ด้วยความหวังว่ามันจะช่วยให้คนอื่น ๆ ที่ (เช่นฉัน) rsync
สะดุดขึ้นมาบนหน้านี้ผ่านการค้นหาและต้องมีคำอธิบายที่ดีขึ้นของ
ด้วยการรวมกันของ--itemize-changes
ธงและ-vvv
ธงrsync
ช่วยให้เรามีการส่งออกรายละเอียดทั้งหมดของการเปลี่ยนแปลงระบบไฟล์ที่ได้ระบุไว้ในไดเรกทอรีแหล่งที่มาเมื่อเทียบกับไดเรกทอรีเป้าหมาย จากrsync
นั้นแฟล็กบิตที่สร้างขึ้นสามารถถูกถอดรหัสเพื่อกำหนดสิ่งที่เปลี่ยนแปลง ในการถอดรหัสความหมายของแต่ละบิตให้ใช้ตารางต่อไปนี้
คำอธิบายของแต่ละตำแหน่งบิตและค่าในrsync
เอาต์พุต:
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")
ตัวอย่างผลลัพธ์บางส่วนจาก rsync สำหรับสถานการณ์ต่างๆ:
>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/
การบันทึกrsync
เอาต์พุต (เน้นที่แฟล็กบิต):
ในการทดลองของฉันทั้ง--itemize-changes
ธงและ-vvv
ธงที่มีความจำเป็นที่จะได้รับrsync
การส่งออกรายการสำหรับทุกการเปลี่ยนแปลงระบบไฟล์ หากไม่มี-vvv
แฟล็ก triple verbose ( ) ฉันไม่เห็นไดเร็กทอรีลิงก์และการเปลี่ยนแปลงอุปกรณ์ในรายการ ควรทดลองกับ rsync เวอร์ชันของคุณเพื่อให้แน่ใจว่ามีการสังเกตและสังเกตทุกสิ่งที่คุณคาดหวัง
การใช้เทคนิคนี้อย่างมีประโยชน์อย่างหนึ่งคือการเพิ่ม--dry-run
แฟล็กลงในคำสั่งและรวบรวมรายการการเปลี่ยนแปลงตามที่กำหนดโดย rsync ลงในตัวแปร (โดยไม่ต้องทำการเปลี่ยนแปลงใด ๆ ) เพื่อให้คุณสามารถดำเนินการบางอย่างในรายการได้ด้วยตัวเอง สิ่งต่อไปนี้จะจับผลลัพธ์ในตัวแปร:
file_system_changes=$(rsync --archive --acls --xattrs \
--checksum --dry-run \
--itemize-changes -vvv \
"/some/source-path/" \
"/some/destination-path/" \
| grep -E '^(\.|>|<|c|h|\*).......... .')
ในตัวอย่างด้านบนเอาต์พุต (stdout) จากrsync
ถูกเปลี่ยนเส้นทางไปยังgrep
(ผ่าน stdin) ดังนั้นเราจึงสามารถแยกเฉพาะบรรทัดที่มีแฟล็กบิต
การประมวลผลเอาต์พุตที่จับได้:
จากนั้นสามารถบันทึกเนื้อหาของตัวแปรเพื่อใช้ในภายหลังหรือทำซ้ำได้ทันทีสำหรับรายการที่น่าสนใจ rsync
ฉันจะใช้กลยุทธ์นี้แน่นอนในสคริปต์ที่ผมเขียนในระหว่างการวิจัยเพิ่มเติมเกี่ยวกับ คุณสามารถดูสคริปต์ ( https://github.com/jmmitchell/movestough ) สำหรับตัวอย่างของการประมวลผลหลังการประมวลผลเอาต์พุตที่จับเพื่อแยกไฟล์ใหม่ไฟล์ที่ซ้ำกัน (ชื่อเดียวกันเนื้อหาเดียวกัน) การชนกันของไฟล์ (ชื่อเดียวกันต่างกัน เนื้อหา) ตลอดจนการเปลี่ยนแปลงโครงสร้างไดเร็กทอรีย่อย