ฉันจะสร้าง rsync ลบไฟล์ที่ถูกลบจากโฟลเดอร์ซอร์สได้อย่างไร


194

ฉันเพิ่งตั้งค่าเครื่องกับเซิร์ฟเวอร์ Ubuntu เพื่อโฮสต์เซิร์ฟเวอร์เกม ฉันติดตั้งปลั๊กอินสำรองสำหรับเซิร์ฟเวอร์เกมแต่ละตัวที่สร้างสำเนาสำรองของไฟล์เกมทั่วโลกในโฟลเดอร์เฉพาะบนเครื่อง ฉันยังสร้างcronภารกิจเพื่อคัดลอกข้อมูลสำรองเหล่านั้นไปยังโฟลเดอร์ Dropbox ของฉันทุกคืนโดยใช้ rsync พร้อม-aตัวเลือก

หลังจากไม่กี่เดือนบัญชี Dropbox ของฉันถึงขีด จำกัด พื้นที่เก็บข้อมูลและฉันรู้ว่าฉันจะไม่สามารถสำรองข้อมูลได้มากมายดังนั้นฉันจึงกำหนดค่าปลั๊กอินสำรองเซิร์ฟเวอร์เกมเพื่อไม่เก็บข้อมูลสำรองจำนวนมากจากนั้นรอสองสามวันเพื่อดูว่าจะ ลบข้อมูลสำรองที่เก่ากว่าเนื่องจากมีกำหนดที่จะทำทุกสัปดาห์ ในที่สุดปลั๊กอินสำรองก็ทำงานและลบข้อมูลสำรองที่เก่ากว่าดังนั้นฉันคาดหวังว่าrsyncงาน cron จะลบข้อมูลสำรองเก่าออกจากโฟลเดอร์ Dropbox ของฉันเพื่อให้ตรงกับโฟลเดอร์ต้นทาง แต่ไม่ได้ทำเช่นนั้น ดังนั้นฉันมีคำถามสองสามข้อ:

  • โดยค่าเริ่มต้นไม่rsyncเพียงเพิ่มไฟล์ไปยังโฟลเดอร์ปลายทางที่ได้รับการบันทึกลงในโฟลเดอร์แหล่งที่มาและเปลี่ยนไฟล์ที่ได้รับการเปลี่ยนแปลงในโฟลเดอร์ต้นทาง แต่ไม่ลบไฟล์ที่ถูกลบออกจากโฟลเดอร์ต้นทาง?

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

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

คำตอบ:


227

หากต้องการลบไฟล์ในเป้าหมายให้เพิ่ม--deleteตัวเลือกในคำสั่งของคุณ ตัวอย่างเช่น:

rsync -avh source/ dest/ --delete

15
ตรวจสอบให้แน่ใจว่าแหล่งที่มาเป็นไดเรกทอรี การใช้source/* dest/จะไม่ทำงาน
ทอม Saleeba

3
ฉันพบว่าเหตุการณ์ที่มี--deleteหรือ--delete-afterจะไม่ลบเนื่องจากข้อผิดพลาด: "พบข้อผิดพลาดของ IO - การข้ามการลบไฟล์" ในการแก้ไข--ignore-errorsตัวเลือกการเพิ่มนี้และแก้ไขข้อผิดพลาดแยกต่างหาก
MHT

12
ทำงานได้อย่างสมบูรณ์แบบ! แม้ว่ามันจะใช้งานได้ดีฉันก็จะแนะนำให้ใช้-n, --dry-runตัวเลือกเสมอก่อนที่จะทำงานrsyncโดยเฉพาะอย่างยิ่งเมื่อมันมาถึงตัวเลือกเช่นนี้ ( --delete) มันจะหลีกเลี่ยงอาการปวดหัวที่เป็นไปได้ :)
ivanleoncz

2
@MHT: ดูเหมือนไม่มีคำตอบที่สมบูรณ์หากคุณไม่ได้แสดงความคิดเห็น
Lonnie Best

2
@TheBicentennialMan หมายถึง-a -r
x-yuri

45

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

ฉันแนะนำให้คุณใช้rsyncสำหรับการสำรองข้อมูลจากไฟล์ต้นฉบับและใช้find ... rmสำหรับการลบไฟล์เป็นระยะเวลาหรือขนาดของไฟล์:

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

บล็อกโค้ดด้านบนทำการสำรองข้อมูลจากแหล่งที่มาแล้วลบทุกไฟล์ที่เวลาแก้ไขล่าสุดมากกว่า 2 เดือน

UPDATE

จากที่ฉันพบว่าdeleteตัวเลือกสำหรับ TARGET ซึ่งถ้าบางไฟล์ถูกลบออกจากแหล่งที่มาให้rsync --deleteลบออกจาก TARGET และdeleteตัวเลือกโดยafterและbeforeตามที่กล่าวไว้ในหน้าคนของมัน:

--delete-before         receiver deletes before transfer, not during

หมายความว่า:

  1. rsync ลบไฟล์จากเป้าหมายซึ่งถูกลบออกจากแหล่งที่มา
  2. rsync เริ่มซิงค์ไฟล์

--delete-after receiver deletes after transfer, not during

หมายความว่า:

  1. rsync เริ่มซิงค์ไฟล์
  2. rsync ลบไฟล์จากเป้าหมายซึ่งถูกลบออกจากแหล่งที่มาหลังจากการซิงค์

หมายเหตุ : การ--delete-{before/after}ใช้งานเพียงแค่ในเป้าหมาย


1
ขอบคุณสำหรับการตอบกลับ!! คุณอ้างถึงตัวเลือก "ลบ" สำหรับ rsync หรือไม่ ทำไมฉันไม่สามารถใช้ตัวเลือก "ลบ" สำหรับ rsync ได้?
user254251

@ user254251, หากคุณใช้การลบคำสั่ง rsync จะลบไฟล์ทันที แต่ในกรณีนี้มีเวลามากขึ้นสำหรับข้อผิดพลาดใด ๆ
shgnInc

ถ้าฉันเข้าใจถูกต้องคุณกำลังบอกว่าฉันควรแยกงานการลบออกจากงาน rsync เพื่อหลีกเลี่ยงข้อผิดพลาด ฉันมีคำถาม แต่ หน้าคู่มือสำหรับ rsync แสดงรายการตัวเลือกบางอย่างที่ดูเหมือนว่าจะให้บริการเพื่อวัตถุประสงค์ในการแยกงานการลบโดยเรียกใช้ก่อนหรือหลังงานคัดลอก ตัวอย่างเช่นฉันเห็นสองตัวเลือกที่เรียกว่า --delete-before และ --delete-after rsync กับตัวเลือกเหล่านี้จะมีผลเช่นเดียวกับวิธีที่คุณอธิบายหรือไม่ ฉันอ่านคำอธิบายทั้งหมดของแต่ละตัวเลือกในหน้าคู่มือ แต่มีข้อมูลบางอย่างในคำอธิบายที่ฉันไม่เข้าใจ
user254251

@ user254251, คำตอบได้รับการปรับปรุง ฉันไม่ทราบว่ามีวิธีลบไฟล์จากเป้าหมายตามเวลาที่ จำกัด ในrsyncหรือไม่
shgnInc

ขอบคุณ! คุณคิดว่าฉันปลอดภัยจากข้อผิดพลาดหรือไม่ถ้าฉันใช้ตัวเลือก --delete-before? ฉันไม่ได้ระบุการหมดเวลาดังนั้นฉันไม่ควรกังวลหากขั้นตอนการลบ rsync นั้นล่าช้าการถ่ายโอน rsync ทำงานวันละครั้งและมีเวลาในการซิงค์ไฟล์สำรองข้อมูลก่อนการซิงค์ครั้งต่อไปดังนั้นฉันไม่ควร จำกัด เวลาในการซิงค์เช่นกัน
user254251

6

คำสั่งนี้จะคัดลอกข้อมูลที่เพิ่มขึ้นและเก็บไว้ในซิงค์กับเซิร์ฟเวอร์ระยะไกล

  1. มันจะคัดลอกข้อมูลที่เพิ่มขึ้นเท่านั้น
  2. มันจะลบหากมีการลบข้อมูลใด ๆ จากแหล่งที่มา
  3. มันจะคัดลอกอีกครั้งจากแหล่งที่มาหากข้อมูลใด ๆ ถูกลบที่ปลายทาง
  4. โดยพื้นฐานแล้วคำสั่งนี้จะทำให้สภาพแวดล้อมทั้งสองตรงกัน

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

ตัวอย่าง:

rsync -avWe ssh --delete-before /data root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup

2
ฉันคิดว่า -W ไม่ได้ทำการคัดลอกเฉพาะข้อมูลที่เพิ่มขึ้น แต่เพื่อคัดลอกไฟล์ทั้งหมดเสมอ
Tulains Córdova

ฉันได้รับข้อผิดพลาดนี้โดยการเรียกใช้คำสั่งนี้: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian

1

หากมีข้อผิดพลาดระหว่าง rsync scync rsync จะไม่ลบไฟล์ที่ควรมีแม้ว่าคุณจะใช้ --delete , หรือ--delete-after--delete-before

นี่คือสาเหตุที่เป็นสิ่งสำคัญในการแก้ไขข้อผิดพลาด rsync

ข้อผิดพลาดส่วนใหญ่เกิดจากการใช้--permsตัวเลือกในขณะที่ซิงค์กับระบบไฟล์ที่ไม่ใช่ Linux เมื่อฉันเปลี่ยน--permsด้วย--no-permsข้อผิดพลาดเหล่านั้นก็หายไปแล้วจึงลบการทำงาน

--perms ไม่เป็นไรเมื่อคุณซิงค์จากระบบไฟล์ Linux ไปยังระบบไฟล์ Linux อื่น แต่ถ้าคุณซิงค์จาก Linux กับระบบไฟล์ที่ไม่ใช่ Linux (เช่น NTFS, FAT) --permsจะทำให้เกิดข้อผิดพลาดเนื่องจากrsync ไม่สามารถตั้งค่าสิทธิ์ Linux บน ระบบไฟล์ที่ไม่ใช่ลินุกซ์ ข้อผิดพลาด = ไม่ลบอีกครั้ง

- เมื่อซิงค์กับพาร์ทิชันไม่ Linux ผมใช้--no-permsเพื่อหลีกเลี่ยงข้อผิดพลาดที่ก่อวินาศกรรม--delete, หรือ--delete-after--delete-before

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

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

คำสั่งด้านบนจะลบสิ่งที่ไม่ซิงค์ แต่จะไม่ซิงค์ไฟล์ใด ๆ ดังนั้นคุณควรซิงค์อีกครั้งหลังจากนี้ คำสั่งนั้นขึ้นอยู่กับคำตอบนี้ยกเว้นว่าฉันได้เพิ่ม--ignore-errorsอาร์กิวเมนต์ด้วยดังนั้นมันจะลบแม้ว่าจะมีข้อผิดพลาด


1
ขอบคุณสำหรับทิป! ฉันเป็นผู้เขียนดั้งเดิมของคำถามนี้เมื่อ 5 ปีที่แล้ว ฉันดีใจที่คุณโพสต์สิ่งนี้เพราะฉันวางแผนที่จะตั้งค่าการซิงค์กับไดรฟ์ NTFS ในอนาคตอันใกล้และฉันอาจพบข้อผิดพลาดในการอนุญาตเนื่องจากฉันวางแผนที่จะใช้ตัวเลือก "-a" สำหรับ rsync ซึ่งซิงค์สิทธิ์ (เหนือสิ่งอื่นใด) ดังนั้นฉันจึงเพิ่ม "- ไม่ผิด" ในบันทึกของฉัน ตอนนี้ฉันวางแผนที่จะใช้ rsync -a - no-perms - ลบก่อนหน้านี้ ฉันมีคำถาม: จะไม่ - ลบ - ก่อนที่จะหลีกเลี่ยงปัญหาเกี่ยวกับการลบไฟล์โดยใช้การลบก่อนทำการซิงค์หรือไม่ คิดว่าเป็นจุดประสงค์ของมัน
254251

@ user254251 - ฉันไม่แน่ใจ ฉันเดาว่ามันจะขึ้นอยู่กับว่ามันจะเร็วแค่ไหน "ลบก่อนหน้า" หากมีวิธีพบข้อผิดพลาดหนึ่งข้อก่อนที่การลบจะเริ่มต้น คำแนะนำของฉันคือการหลีกเลี่ยง NTFS เมื่อใดก็ตามที่คุณสามารถทำได้เว้นแต่คุณจะชอบความเจ็บปวดอย่างรุนแรงในตูดของคุณ :) NTFS เป็น NTFS ทำงานได้ดี NTFS เพื่อ Linix ทำงานได้ดี หลีกเลี่ยง "ระบบไฟล์ Linux" เป็น "ระบบไฟล์ที่ไม่ใช่ Linux"; มันเจ็บปวดมากเกินไปที่จะตรวจสอบให้แน่ใจว่าการลบงานถูกต้อง คุณสามารถทำสิ่งนี้ได้ แต่ฉันคิดว่ามันไม่คุ้มกับปัญหาเมื่อเทียบกับการฟอร์แมตไดรฟ์ปลายทางเป็น EXT4
Lonnie Best
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.