คู่มือนี้แนะนำวิธีแก้ปัญหา Argument list too long เมื่อพยายามลบไฟล์จำนวนมากในโฟลเดอร์เดียว
สาเหตุ
- Kernel จำกัดขนาด Argument list (ARG_MAX) ประมาณ 2MB (ดูได้ด้วย
getconf ARG_MAX)
- Wildcard
* ขยายเป็นรายการไฟล์ทั้งหมด → เกินขีดจำกัด
- พบบ่อยใน: Mail queue (
/var/spool/clientmqueue), Session files, Cache directories
วิธีแก้: ใช้ find + xargs
# ลบไฟล์ขึ้นต้นด้วย spam-
find . -name 'spam-*' | xargs rm
# ลบไฟล์ทั้งหมดในโฟลเดอร์
find . -name '*' | xargs rm
# หรือ
find . -type f | xargs rm
อธิบายการทำงาน
| ส่วน | คำอธิบาย |
find . -name 'pattern' | หาไฟล์ตาม pattern (ไม่ขยาย argument) |
| | Pipe ส่งรายการไฟล์ไป xargs |
xargs rm | รวม argument แล้วรัน rm หลายครั้ง (chunked) ไม่เกิน ARG_MAX |
ตัวเลือก xargs ที่มีประโยชน์
# แสดงคำสั่งก่อนรัน (Dry run)
find . -name 'spam-*' | xargs -t rm
# รันแบบ Parallel (เร็วขึ้นบหลาย Core)
find . -name 'spam-*' | xargs -P 4 rm
# จำกัดจำนวน argument ต่อครั้ง
find . -name 'spam-*' | xargs -n 100 rm
# จัดการชื่อไฟล์ที่มี Space/Newline
find . -name 'spam-*' -print0 | xargs -0 rm
วิธีอื่น: find -delete (Simplest)
# ลบไฟล์ตรงตาม pattern (ไม่ต้อง xargs)
find . -name 'spam-*' -delete
# ลบไฟล์ทั้งหมด
find . -type f -delete
-delete = Action ใน find เอง (Internal, ไม่ fork process)
- เร็วกว่า xargs และปลอดภัยต่อชื่อไฟล์พิเศษ
- รองรับ
-depth สำหรับลบโฟลเดอร์ว่าง: find . -depth -type d -empty -delete
กรณีโฟลเดอร์มีไฟล์มากมาย (Millions)
# ใช้ rsync กับโฟลเดอร์ว่าง (เร็วที่สุดสำหรับลบจำนวนมหาศาล)
mkdir /tmp/empty
rsync -a --delete /tmp/empty/ /path/to/huge/directory/
rmdir /tmp/empty
สรุปวิธีที่แนะนำ
- find ... -delete - ง่ายที่สุด เร็ว ปลอดภัย (แนะนำเป็นหลัก)
- find ... -print0 | xargs -0 rm - เมื่อต้องการควบคุมเพิ่มเติม
- rsync --delete - สำหรับลบไฟล์จำนวนมหาศาล (Millions+)
ไม่ต้องกังวล Argument list too long อีกต่อไป - ใช้ find แทน wildcard expansion