xargs เป็น "กาว" ระหว่างคำสั่ง อ่าน input จาก stdin แล้วส่งเป็น arguments ให้คำสั่งถัดไป ทำงานคู่กับ find, grep ได้ดีมาก
พื้นฐาน
echo "Documents" | xargs ls
| (pipe) ส่ง stdout ของคำสั่งซ้าย → stdin ของ xargs
ร่วมกับ find: จัดการหลายไฟล์
คัดลอกเนื้อหาไฟล์เดียวไปหลายไฟล์:
find ./test-dir1 -name "*.txt" | xargs -n1 cp test0.txt
-n1: ใช้ argument ทีละ 1 ต่อ 1 การรัน cp- หากไม่มี -n1: cp จะได้ argument หลายตัวพร้อมกัน (copy ไฟล์สุดท้ายทับไฟล์ก่อนหน้า)
ลบไฟล์จำนวนมาก (หลีกเลี่ยง "Argument list too long"):
find ./test-dir2 -type f -name "*.pdf" -print | xargs rm -f
xargs แบ่ง argument เป็นชุดๆ เรียก rm หลายครั้ง
ค้นหา Pattern (find + xargs + grep)
find . -name "*.txt" | xargs grep "search_term"
หา "search_term" ในทุก .txt ไฟล์
Copy/Move ไฟล์ด้วย placeholder ({})
find . -name "*.txt" -mmin +10 | xargs -n1 -I '{}' mv '{}' ../
-I '{}': กำหนด placeholder ชื่อ{}จะถูกแทนที่ด้วย filename แต่ละตัว- ย้าย .txt ที่เก่ากว่า 10 นาที ไปโฟลเดอร์บน
ควบคุมการทำงานเมื่อไม่มี input (-r)
find . -name "*.txt" | xargs -r ls -l
-r (--no-run-if-empty): หาก find ไม่เจออะไร xargs จะไม่รัน ls (ป้องกัน error/รายการไฟล์ปัจจุบัน)
ตัวเลือกสำคัญอื่นๆ
| Option | คำอธิบาย |
|---|---|
-n N | ใช้ max N arguments ต่อการรันคำสั่ง 1 ครั้ง |
-P N | รันแบบ parallel N processes พร้อมกัน (เร็วขึ้นบน multi-core) |
-0 | Input คั่นด้วย null (\0) แทน whitespace - ใช้กับ find -print0 ปลอดภัยสำหรับชื่อไฟล์มี space |
-t | พิมพ์คำสั่งที่จะรันก่อนรันจริง (debug) |
-p | Prompt ยืนยันก่อนรันแต่ละคำสั่ง |