ฉันจะลบโฟลเดอร์ที่มีโฟลเดอร์ย่อยจำนวนมากได้อย่างรวดเร็วได้อย่างไร


15

ฉันมีโฟลเดอร์ที่มีโฟลเดอร์ย่อย 266778 ฉันจะลบมันได้อย่างไร

ฉันเหนื่อย

cd ~/.local/share/Trash/
sudo rm -rf *

แต่มันใช้เวลามาก หลังจาก 1 นาที 25 วินาทีในเวลาจริงและเวลาผู้ใช้ 0.072 วินาทีมันเพียงลบ 2,500 โฟลเดอร์ วิธีนี้จะใช้เวลานานกว่าสองชั่วโมงในการลบโฟลเดอร์นี้

มีวิธีที่รวดเร็วกว่าในการลบโฟลเดอร์นี้หรือไม่? เหตุใดจึงมีความแตกต่างอย่างมากระหว่างเวลาของผู้ใช้กับเวลาจริง

real    1m25.474s
user    0m0.072s
sys     0m28.142s

ฉันใช้ Linux 2.6.32 (Ubuntu 10.04.4 LTS)


ฉันเพิ่ง googled ปัญหานี้และดูเหมือนว่าบางคนพบว่า rsync สามารถใช้เป็นเครื่องมือ "การลบไฟล์จำนวนมาก" ได้อย่างมีประสิทธิภาพ ไม่ว่ามันจะเร็วขึ้นหรือไม่นั้นยังขึ้นอยู่กับคุณที่จะประเมิน
Johan

2
สำหรับสิ่งที่มีค่า: ประสิทธิภาพเมื่อลบโฟลเดอร์ / ไฟล์จำนวนมากขึ้นอยู่กับระบบไฟล์สูง จากประสบการณ์ของฉันความแตกต่างเมื่อลบไฟล์ขนาดเล็กหลายล้านไฟล์บน ext3 (ช้า) และ XFS (เร็ว) อาจเป็นชั่วโมง
pdo

หากคุณมีกรณีนี้อยู่บ่อยครั้งและคุณสามารถวางแผนล่วงหน้าโดยใช้ระบบไฟล์เช่น btrfs และการใช้ซับวูฟเฟอร์คุณสามารถเพิ่มความเร็วได้อย่างรวดเร็วเพียงแค่ทิ้งซับวูฟเฟอร์นั้น
PlasmaHH

ที่นี่คุณสามารถค้นหาคำตอบได้ที่นี่ perl one นั้นเร็วที่สุด unix.stackexchange.com/questions/37329/…
SDsolar

คำตอบ:


17

หากเวอร์ชัน "find" ของคุณใช้คำสั่งย่อย -delete คุณสามารถลองได้

find directory -delete

ในกรณีนี้:

find ~/.local/share/Trash/ -delete

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


+1; แม้ว่าจะเป็นการลบผู้ปกครองหลักและฉันสงสัยว่า OP ต้องการเพียงแค่ลบเนื้อหาของโฟลเดอร์ถังขยะไม่ใช่โฟลเดอร์เอง
don_crissti

1
@don_crissti: คำพูดที่ดี หาก OP ต้องการลบเฉพาะ Sub ภายใต้ ~ / .local / share / Trash (และไม่ใช่ไฟล์ในระดับที่ 1) ดังนั้น: find ~/.local/share/Trash/*/ -delete (แน่นอนสิ่งนี้จะลบไฟล์ (และ dirs) ใน Trash / * / ตำบลเช่นกัน)
Olivier Dulac

2
+1 สำหรับอธิบายพฤติกรรมแปลก ๆ ของtime
Martin Thoma

3
คือfind directory -deleteจริงๆเร็วกว่าrm -rf directory? ท้ายที่สุดพวกเขาทำงานเดียวกันและไม่มีสองวิธีที่จะทำ
Gilles 'หยุดความชั่วร้าย'

1
@Johan พบว่ามันเร็วมาก คุณเคยมีโอกาสค้นพบเหตุผลหรือไม่?
Harshdeep

20

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

{ mv directory directory.gone && rm -rf directory.gone; } &

ในทางเทคนิคนี่เป็นการโกงเนื่องจากฉันไม่ได้เร่งการลบจริง ๆ แต่จริงๆแล้วมันมีประโยชน์มาก: ฉันใช้เคล็ดลับนี้ตลอดเวลาดังนั้นฉันจึงไม่ต้องรอการลบแบบช้า


ยิ่งใหญ่ คุณใช้กรณีอะไรในการทำสิ่งนี้ตลอดเวลา? ถ้าคุณทำมันมากมันจะไม่เป็นอันตรายคุณจะค้างรับหลาย directory.gone และล้มเหลว? ฉันคิดว่าคุณใช้คำต่อท้ายเช่น '$$' หรือ '% (date ... )'
smci

1
ถ้าฉันต้องการให้ฉันสามารถใช้ mktemp กับข้อโต้แย้งที่ทำให้แน่ใจว่ามันอยู่ในระบบไฟล์เดียวกัน แต่ฉันไม่สามารถพูดได้ว่าฉันมีตัวอย่างที่เฉพาะเจาะจงในขณะนี้
kojiro

Kojiro ใช่ขอบคุณmktempเป็นสิ่งที่ผมพยายามที่จะจำ ...
smci

1

rm -rf directoryหรือrm -rf *แน่นอนเป็นวิธีที่เร็วที่สุดเว้นแต่rmการดำเนินการในท้องถิ่นของคุณจะไม่ทำงาน

การใช้findไม่ได้ประโยชน์อะไรเลย

ไม่ว่าจะเร็วหรือช้าส่วนใหญ่ขึ้นอยู่กับระบบไฟล์และการใช้งานระบบปฏิบัติการ ดังนั้นคำถามดูเหมือนจะไม่เหมาะสม

เป็นที่ทราบกันว่า UFS และ ZFS บน Solaris นั้นมีความรวดเร็วมากในการทำงานประเภทนี้เนื่องจากการใช้งานระบบไฟล์รวมถึงการลบรหัสพื้นหลังที่ล่าช้าซึ่งทำให้การเรียกunlink()และrmdir()การส่งคืนอย่างรวดเร็วแม้ว่าวัตถุที่เกี่ยวข้องจะใช้เวลามากกว่า

ด้วยการลบพื้นหลังล่าช้าในเคอร์เนลการอัพเดทไดเรกทอรีสามารถทำได้อย่างรวดเร็วเช่นกันและช่วยให้การดำเนินการทั้งหมดรวดเร็วขึ้น


ในขณะที่บางคนอาจได้รับการให้อภัยเพราะคิดว่าจริง ๆ แล้วมันไม่จริงอย่างที่คำตอบนี้อธิบาย
Hitechcomputergeek

0

นี่เป็นเพียงคำตอบบางส่วนเท่านั้นส่องไฟในสามค่าที่คำสั่งส่งคืน ยกมาจากtime(1)manpage :

(i) เวลาจริงที่ผ่านไประหว่างการเรียกใช้และการยกเลิก (ii) เวลา CPU ของผู้ใช้ (ผลรวมของtms_utimeและtms_cutimeค่าใน a struct tmsตามที่ส่งคืนโดยtimes(2)) และ (iii) เวลา CPU ของระบบ (ผลรวมของtms_stimeและtms_cstimeค่าในstruct tmsตามที่ส่งคืนโดยtimes(2)) "

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