Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> สมาร์ทโฟน >> Linux

วิธีแก้ไข Error '/bin/rm: Argument list too long' ใน Linux

คู่มือนี้แนะนำวิธีแก้ปัญหา 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

อธิบายการทำงาน

ตัวเลือก 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

สรุปวิธีที่แนะนำ

  1. find ... -delete - ง่ายที่สุด เร็ว ปลอดภัย (แนะนำเป็นหลัก)
  2. find ... -print0 | xargs -0 rm - เมื่อต้องการควบคุมเพิ่มเติม
  3. rsync --delete - สำหรับลบไฟล์จำนวนมหาศาล (Millions+)

ไม่ต้องกังวล Argument list too long อีกต่อไป - ใช้ find แทน wildcard expansion

ส่วนคำอธิบาย
find . -name 'pattern'หาไฟล์ตาม pattern (ไม่ขยาย argument)
|Pipe ส่งรายการไฟล์ไป xargs
xargs rmรวม argument แล้วรัน rm หลายครั้ง (chunked) ไม่เกิน ARG_MAX