ฉันมีไดเรกทอรีที่มีไฟล์สองแสนไฟล์
ฉันต้องการลบไฟล์ทั้งหมด แต่รายงาน rm * -f: "รายการอาร์กิวเมนต์ยาวเกินไป"
วิธีที่ดีที่สุดในการล้างไดเรกทอรีนี้คืออะไร?
ฉันมีไดเรกทอรีที่มีไฟล์สองแสนไฟล์
ฉันต้องการลบไฟล์ทั้งหมด แต่รายงาน rm * -f: "รายการอาร์กิวเมนต์ยาวเกินไป"
วิธีที่ดีที่สุดในการล้างไดเรกทอรีนี้คืออะไร?
คำตอบ:
ในกรณีที่คุณไม่สามารถลบไดเรกทอรีคุณสามารถใช้ find
find . -maxdepth 1 -type f -exec rm -f {} \;
ที่จะลบไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและเฉพาะไดเรกทอรีปัจจุบัน (ไม่ใช่ไดเรกทอรีย่อย)
find dir/to/delete -delete
(ไม่วางrm
กระบวนการต่อไฟล์ที่จะลบ)
find dir/to/delete -type f -delete
หา -maxdepth 1 -type f -exec rm -f {} \;
มันใช้เวลานานเกินไป (หนึ่ง exec ของ rm ต่อไฟล์)
อันนี้มีประสิทธิภาพมากขึ้น:
หา -maxdepth 1 -type f -print0 | xargs -r0 rm -f
ตามที่ใช้ชื่อไฟล์มากที่สุดเท่าที่เป็นไปได้เพื่อโต้แย้ง rm มากที่สุดแล้วรัน rm ด้วยชื่อไฟล์ที่โหลดถัดไป ... อาจเกิดขึ้นได้ว่า rm นั้นถูกเรียกเพียง 2 หรือ 3 ครั้ง
ionice
ก่อนrm
เป็นความคิดที่ดีถ้าผู้อื่นใช้คอมพิวเตอร์ในเวลาเดียวกัน
ทั้งสองอย่างนี้จะทำให้เกิดปัญหา มีการวิเคราะห์ผลการดำเนินงานที่เกี่ยวข้องของแต่ละเทคนิคมากกว่าคือที่นี่
find . -name WHATEVER -exec rm -rf {} \;
หรือ
ls WHATEVER | xargs rm -rf
ปัญหาเกิดจากการทุบตีขยาย "*" ด้วยทุก ๆ รายการในไดเรกทอรี โซลูชันทั้งสองนี้ทำงานผ่านแต่ละไฟล์แทน
find . -print0 | xargs -0 rm
)
ls *
" และ " *
" ขยายไปยังรายการอาร์กิวเมนต์ที่เชลล์ของคุณบ่นว่ายาวเกินไป ทำ " ls .
" แทน (หรือขึ้นไปหนึ่งระดับไดเรกทอรีและทำ " ls [dirname]
")
ฉันสามารถทำได้โดยสำรองหนึ่งระดับ:
cd ..
และวิ่ง:
rm directory name -rf
จากนั้นสร้างไดเรกทอรีขึ้นใหม่
การค้นหาการเรียกใช้ทั้งหมดเหล่านี้เป็นสิ่งที่ดีมาก แต่ฉันแทบจำไม่ได้ว่าระบบการตั้งชื่อที่จำเป็นเมื่อฉันรีบ: ฉันใช้ ls แทน ในฐานะที่เป็นคนกล่าวถึง ls จะทำงาน แต่ฉันชอบ ls -1 เช่นเดียวกับใน:
ls -1 | xargs -n 100 rm -rf
รูป -n xxx นั้นค่อนข้างปลอดภัยที่จะเล่นโดยมีค่าเกินจำนวนสูงสุดจะได้รับการแก้ไขอัตโนมัติ (ถ้าเกินขนาดสูงสุด, ดู -s) หรือ args-max สำหรับแอปนั้นเกินปกติ ชัดเจน.
ควรสังเกตว่า grep มีประโยชน์ในการแทรกตรงกลางของเชนนี้เมื่อคุณต้องการลบไฟล์ย่อยในไดเร็กตอรี่ขนาดใหญ่, และไม่ว่าด้วยเหตุผลใดก็ตามที่ต้องการใช้ find.
คำตอบนี้สมมติว่าคุณกำลังใช้ยูทิลิตีหลักของ Gnu สำหรับ ls, xargs & ฯลฯ
คุณสามารถใช้-exec +
ตัวเลือกเพื่อค้นหาว่าจะลองใช้ rm สองสามครั้งเท่าที่จะทำได้ซึ่งอาจเร็วกว่า
find . -type f -exec rm '{}' +
นี่คือเวอร์ชันสำหรับการลบไฟล์จำนวนมากเมื่อระบบต้องการตอบสนอง
มันทำงานได้โดยการออกงานเป็นชุดเล็ก ๆ (100 ไฟล์โดยค่าเริ่มต้น) และรอสักครู่เพื่อให้งานอื่นให้เสร็จ
ทำงานได้อย่างยอดเยี่ยมสำหรับการลบไฟล์กว่าครึ่งล้านไฟล์จากไดเรกทอรีเดียวบน ext3 มันพิมพ์เปอร์เซ็นต์ที่ทำเป็นโบนัสเล็กน้อย
noOfFiles=`ls -U | wc -l`
n=0
while (ls -U | tail -n 100 | xargs rm -f); do
n=$((n+100));
sync;
echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
sleep 5;
done
แก้ไขข้อผิดพลาด "อาร์กิวเมนต์ยาวเกินไป" หรือ "ไม่สามารถจัดสรรหน่วยความจำ"
นี่เป็นการหลอกลวงสำหรับไฟล์ 220,000+ ไฟล์ในโฟลเดอร์เซสชั่น ....
ข้อได้เปรียบ: เริ่มลบไฟล์ทันที
เส้นทางซีดี / ถึง / โฟลเดอร์
ls -f | xargs rm -f -v
คลิกเพื่อลบภาพหน้าจอของไฟล์ - (ลบไฟล์ทั้งหมดใน ~ 15 นาที)
-f (หลังจาก ls)ป้องกันการเรียงลำดับล่วงหน้า
-v (หลังจาก rm)แสดงแต่ละไฟล์ว่าถูกลบ
-f (หลังจาก rm)บังคับให้ผ่านโดยไม่มีพรอมต์สำหรับไฟล์ที่ป้องกันการเขียน
เคล็ดลับ:เปลี่ยนชื่อโฟลเดอร์(เซสชันเดิมเป็น session_old)ก่อนเพื่อป้องกันไม่ให้มีการเพิ่มไฟล์ที่สร้างอัตโนมัติเพิ่มเติมในขณะที่คุณพยายามลบไฟล์ คุณสามารถสร้างไดเรกทอรีดั้งเดิมใหม่ได้ด้วยตนเองหากไม่ได้ทำแบบอัตโนมัติเหมือนในกรณีของฉัน