ลบไฟล์ที่ไม่เกี่ยวข้องจาก dest dir ผ่าน rsync หรือไม่


51

บอกว่าฉันมี

SRC 
  001.jpg
  002.jpg
  001.txt
  a.zip

DEST
  hello.jpg

rsync -d --delete SRC:{*.jpg,*.txt} DEST

มันไม่ได้ลบ hello.jpg จาก DEST ความคิดใด ๆ วิธีเก็บถาวรหรือไม่

คำตอบ:


72

เหตุผลที่คำสั่งของคุณไม่ทำงานอธิบายโดยหน้าคู่มือสำหรับ rsync (เพิ่มการเน้น):

--ลบ

สิ่งนี้จะบอก rsync ให้ลบไฟล์ที่ไม่เกี่ยวข้องออกจากด้านที่รับ (ไฟล์ที่ไม่ได้อยู่ในฝั่งที่ส่ง) แต่สำหรับไดเรกทอรีที่กำลังซิงโครไนซ์เท่านั้น คุณต้องขอให้ rsync ส่งไดเรกทอรีทั้งหมด (เช่น "dir" หรือ "dir /") โดยไม่ต้องใช้ wildcard สำหรับเนื้อหาของไดเรกทอรี (เช่น "dir / *") เนื่องจาก wildcard ถูกขยายโดยเชลล์และ rsync จึงได้รับ ร้องขอให้โอนไฟล์แต่ละไฟล์ไม่ใช่ไดเรกทอรีหลักของไฟล์ ไฟล์ที่ถูกแยกออกจากการถ่ายโอนนั้นจะถูกแยกออกจากการถูกลบด้วยเว้นแต่ว่าคุณจะใช้ตัวเลือก --delete-แยกหรือทำเครื่องหมายกฎว่าเป็นการจับคู่เฉพาะในฝั่งการส่งเท่านั้น (ดูตัวดัดแปลงรวม / แยกในส่วนกรองกฎ)

ดังนั้นเมื่อคุณวิ่ง

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST

ไฟล์ที่ไม่ต้องการใน DEST จะไม่ถูกลบเนื่องจากคุณยังไม่ได้ขอให้ซิงค์ไดเรกทอรี แต่เพียงแค่ไฟล์จำนวนหนึ่งเท่านั้น หากต้องการรับผลลัพธ์ที่คุณต้องการลองทำดังนี้:

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/

ขอให้สังเกตว่าคำสั่งของการรวมและไม่รวมคำสั่งเรื่อง โดยพื้นฐานแล้วแต่ละไฟล์จะถูกตรวจสอบกับรูปแบบการรวมหรือไม่รวมตามลำดับที่ปรากฏ ดังนั้นไฟล์ที่มีนามสกุล. jpg หรือ. txt จะถูกซิงค์เนื่องจากตรงกับรูปแบบ "รวม" ก่อนที่จะตรงกับรูปแบบที่ยกเว้น "*" ทุกอย่างอื่นถูกแยกออกโดย--exclude '*'รูปแบบ --delete-excludedตัวเลือกที่ช่วยให้มั่นใจว่าไฟล์ที่ได้รับการยกเว้นแม้กระทั่งในด้าน DEST จะถูกลบออก


@ เฉิงสนใจอธิบายเพิ่มเติมอีกเล็กน้อยไหม? ฉันยินดีที่จะอัพเดทคำตอบหากมีปัญหา / การปรับปรุง
Steven D

มันได้ผล. ฉันคิดว่า. - กระบวนการสิ่งต่าง ๆ ทำให้ฉันสับสนทำให้ฉันคิดว่ามันถูกถ่ายโอนอีกครั้ง
เฉิง

ฉันได้แก้ไขคำตอบเพื่ออธิบายเพิ่มเติมอีกเล็กน้อย
Steven D

2
@Cheng: --delete-excludedฉันสงสัยว่าคุณไม่ต้องการ ไม่ได้มีเพียง*.jpgและ*.txtอาจถูกลบในด้านปลายทาง ด้วยมันไฟล์ที่ไม่เกี่ยวข้องจะถูกลบเช่นกัน คุณอาจจะสนใจในเรื่องนี้สอนเกี่ยวกับฟิลเตอร์ rsync
Gilles 'หยุดความชั่วร้าย'

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