การใช้ rsync เพื่อลบไฟล์ที่ไม่เกี่ยวข้อง


13

อะไรคือวิธีที่ดีที่สุดในการเปรียบเทียบโครงสร้างไดเรกทอรีทั้งสองและการลบไฟล์และไดเรกทอรีที่ไม่เกี่ยวข้องในตำแหน่งเป้าหมาย

ฉันมีแอพแกลเลอรี่ภาพบนเว็บขนาดเล็กที่ฉันกำลังพัฒนา ผู้ใช้เพิ่มและลบภาพโดยใช้ FTP ซอฟต์แวร์แกลเลอรีเว็บที่ฉันเขียนสร้างภาพขนาดย่อใหม่ได้ทันที แต่ไม่ได้จัดการกับการลบ สิ่งที่ฉันต้องการจะทำคือกำหนดคำสั่ง / สคริปต์ทุบตีเพื่อดูแลสิ่งนี้ตามช่วงเวลาที่กำหนดไว้ล่วงหน้า

ภาพต้นฉบับจะถูกจัดเก็บไว้ใน/home/gallery/images/และจัดระเบียบในอัลบั้มโดยใช้ไดเรกทอรีย่อย ภาพขนาดเล็กถูกแคชไว้/home/gallery/thumbs/โดยใช้โครงสร้างไดเรกทอรีและชื่อไฟล์เดียวกันกับไดเรกทอรีรูปภาพ

ฉันได้ลองใช้สิ่งต่อไปนี้เพื่อบรรลุเป้าหมาย:

rsync  -r --delete --ignore-existing /home/gallery/images /home/gallery/thumbs

ซึ่งจะทำงานได้ดีหากภาพขนาดย่อทั้งหมดถูกแคชไว้แล้ว แต่ไม่รับประกันว่าจะเป็นเช่นนี้เมื่อเกิดกรณีนี้ขึ้นไดเรกทอรีภาพขนาดย่อมีภาพขนาดเต็มต้นฉบับที่คัดลอกมา

ฉันจะทำสิ่งที่ฉันพยายามทำให้ดีที่สุดได้อย่างไร

คำตอบ:


8

ฉันไม่คิดว่าrsyncเป็นวิธีที่ดีที่สุดสำหรับสิ่งนี้ ฉันจะใช้ทุบตีหนึ่งซับเช่น:

$ cd /home/gallery/thumbs && find . -type f | while read file;do if [ ! -f "../images/$file" ];then echo "$file";fi;done

หากหนึ่งซับนี้สร้างรายการไฟล์ที่ถูกต้องคุณสามารถแก้ไขเพื่อรันrmคำสั่งแทนechoคำสั่ง


ขอบคุณทอม ฉันเดาว่าจะล้างไดเรกทอรีด้วยฉันจะต้องเรียกใช้เป็นครั้งที่สอง แต่ระบุไดเรกทอรีในคำสั่งแทนไฟล์และแทนที่ echo ด้วยrmdir?
ไบรอัน

@Bryan: ใช่มันฟังดูสมเหตุสมผล คุณจะต้องเปลี่ยนธงในfindและในการทดสอบ[ ]แน่นอนโปรดระวังทั้งคำสั่งที่ฉันให้กับคุณและการดัดแปลงใด ๆ และทดสอบด้วยecho!
Tom Shaw

ขอบคุณมากฉันจะใช้เสียงสะท้อนจำนวนมากในขณะทดสอบ
ไบรอัน

1
เพิ่งมีความคิด: คุณสามารถทดสอบด้วย "ls" เพื่อให้แน่ใจว่ามันทำงานได้ดีกับช่องว่าง ด้วยความปรารถนาดี
Tom Shaw

34

คุณต้องการ--existingเช่นกัน:

rsync -r --delete --existing --ignore-existing /home/gallery/images /home/gallery/thumbs

จาก manpage:

  --existing, --ignore-non-existing
          This tells rsync to skip creating files (including  directories)
          that  do  not  exist  yet on the destination.  If this option is
          combined with the --ignore-existing option,  no  files  will  be
          updated  (which  can  be  useful if all you want to do is delete
          extraneous files).

1
หากมีข้อผิดพลาดใด ๆ คำตอบที่ยอดเยี่ยมของคุณจะไม่ทำงาน นั่นเป็นเหตุผลที่คุณต้องเพิ่ม--ignore-errorsอาร์กิวเมนต์ด้วยเช่นกัน นั่นเป็นสิ่งเดียวที่ทำงานให้ฉัน ขอบคุณสำหรับ--existingและ--ignore-existing! ผมใช้คำตอบของคุณเป็นพื้นฐานของคำตอบของฉันที่นี่
LonnieBest

1
@LonnieBest หากมีข้อผิดพลาดไม่ได้rm, cpหรือmvจะทำงานเป็นที่สิ่งที่ผิดพลาดคือ: พวกเขาเป็นปัญหาที่ควรจะมองที่และที่ป้องกันไม่ให้การดำเนินงานที่ประสบความสำเร็จจากการเสร็จสิ้น คุณสามารถแนะนำให้เครื่องมือส่วนใหญ่ละเว้นข้อผิดพลาด (เช่น-fเพื่อrm) แต่ฉันไม่เห็นว่าเกี่ยวข้องกับคำถามหรือคำตอบนี้อย่างไร
Mecki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.