การขอ rsync เพื่อลบไฟล์ทางด้านการรับที่ไม่มีอยู่ทางด้านการส่งโดยมีข้อยกเว้นด้านการรับ


29

ฉันได้อ่านหัวข้อเหล่านี้:

แต่เท่าที่ฉันสามารถบอกได้ (บางทีฉันอาจพลาดบางสิ่ง) พวกเขาไม่ได้ครอบคลุมคำถามต่อไปนี้:

คุณrsyncจะขอให้คัดลอกไฟล์และลบไฟล์ในด้านการรับที่ไม่มีอยู่ในด้านการส่งโดยมีข้อยกเว้นได้อย่างไร? (เช่นอย่าลบที่เก็บ Mercurial .hgที่ด้านการรับแม้ว่าจะไม่มีที่เก็บในฝั่งการส่ง)

ความเป็นไปได้หนึ่งอย่าง?

การยืมจากคำตอบของ @Richard Holloway ด้านล่าง พูดว่าฉันมีบรรทัดต่อไปนี้:

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

เท่าที่ผมเข้าใจบรรทัดนี้จะทำให้ทุกอย่างลบบนเส้นทางที่ได้รับที่ไม่ได้อยู่บนเส้นทางการส่งยกเว้นสิ่งเหล่านั้นจับคู่โดยrsync dont_delete_meคำถามของฉันตอนนี้คือ: rsync จะเก็บไฟล์ในด้านการรับที่ถูกจับคู่dont_delete_me แม้ว่าจะไม่มีอะไรในด้านการส่งdont_delete_meหรือไม่

คำตอบ:


33

หากคุณใช้--deleteและ--excludeร่วมกันสิ่งที่อยู่ในสถานที่ที่ยกเว้นจะไม่ถูกลบแม้ว่าไฟล์ต้นฉบับจะถูกลบ

แต่นั่นทำให้เกิดปัญหาที่โฟลเดอร์จะไม่เป็นrsyncเลย ดังนั้นคุณจะต้องมีrsyncงานอื่นในsyncโฟลเดอร์นั้น

เช่น.

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

คุณสามารถเรียกใช้วิธีอื่น ๆ เหล่านี้ได้ แต่จากนั้นมันจะลบไฟล์ที่ถูกลบทั้งหมดแล้วแทนที่ไฟล์เหล่านั้นซึ่งไม่มีประสิทธิภาพ

คุณไม่สามารถทำมันเป็นหนึ่งซับ


ขอบคุณ @ Richard คำตอบของคุณทำให้ฉันคิดว่าคำถามดั้งเดิมของฉันอาจจะง่ายกว่าที่ฉันคิด หากฉันใช้บรรทัดเดียว: rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/pathจะไม่rsyncลบทุกอย่างบนเส้นทางการรับที่ไม่มีอยู่ในเส้นทางการส่งยกเว้นสิ่งที่จับคู่ด้วยdont_delete_meหรือไม่ สิ่งสำคัญที่สุดคือจะrsyncให้สิ่งต่าง ๆ ในด้านที่ได้รับการจับคู่dont_delete_me แม้ว่าจะไม่มีอะไรในด้านการแข่งขันdont_delete_me ? หากเป็นกรณีนี้ฉันคิดว่าเป็นสิ่งเดียวที่ฉันต้องการใช่ไหม
Amelio Vazquez-Reina

คุณถูกต้อง แต่คุณจะไม่ได้รับไฟล์ใหม่และการเปลี่ยนแปลงไปยังโฟลเดอร์ dont_delete_me หากคุณทำในบรรทัดเดียว หากคุณไม่ต้องการซิงค์การเปลี่ยนแปลงและส่วนเพิ่มเติมคุณสามารถใช้ --exclude flag ตามที่อธิบายไว้ที่นี่
Richard Holloway

@AmV ไฟล์ยกเว้นจะไม่ถูกลบโดยเว้นแต่คุณจะระบุอย่างชัดเจน--delete --delete-excludedดูคำอธิบายของ--deleteและ--delete-excludedในคู่มือ rsync
Gilles 'หยุดความชั่วร้าย'

4

ฉันพบว่าโซลูชันต่อไปนี้ใช้งานได้ตามวัตถุประสงค์ของฉัน:

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(หมายเหตุ: เพิ่ม-nตัวเลือกในการใช้งานแบบแห้งและไม่เปลี่ยน--deleteเป็น--delete-excluded!)

การรันคำสั่งทำให้คุณสมบัติต่อไปนี้:

  • srcไดเรกทอรีแหล่งที่มายังคงไม่ได้แก้ไข
  • destโฟลเดอร์ปลายทางตรงกับโฟลเดอร์ต้นทางยกเว้นว่า:

    • รายการในdo_not_send_to_destรายการจะไม่ถูกส่งไปยังปลายทางและ
    • รายการในdo_not_modify_in_destรายการจะไม่มีการแก้ไขในปลายทาง
  • (หมายเหตุ: ไม่มีปัญหาสำหรับรายการที่ไม่มีอยู่ในรายการในdo_not_ไฟล์ใดไฟล์หนึ่ง "")

คำอธิบาย

ฉันเดาว่า rsync อ่านอาร์กิวเมนต์บรรทัดคำสั่งจากซ้ายไปขวา--deleteอาร์กิวเมนต์ดูเหมือนจะทำให้ rsync ภายใน "โหมดสลับ" (ในความหมาย) ภายในช่วยให้การใช้--exclude-fromตัวเลือกที่สองอีกครั้ง แต่มีความหมายที่แตกต่างกัน

ข้อแม้:

  • หากรายการในdo_not_send_to_destรายการมีอยู่ในปลายทางแล้ว:

    • คำสั่งนี้จะไม่ลบรายการนั้นออกจากปลายทาง (เว้นแต่ว่ารายการนั้นจะถูกลบออกจากไดเรกทอรีแหล่งแรก)
    • ข้อควรระวัง:การเปลี่ยน--deleteเป็น--delete-excludedจะลบทุกอย่างในปลายทางที่อยู่ในรายการทั้งสองรายการของคุณ xD (บางที rsync อาจเขียนได้ว่าเปิด / ยืดหยุ่น แต่มีบางอย่างที่แตกต่าง?)

ทดสอบการใช้งานเบา ๆ

ฉันกำลังใช้ " rsync version 3.0.9 protocol version 30"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.