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

ใช้คำสั่ง xargs ใน Linux อย่างมีประสิทธิภาพ

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/รายการไฟล์ปัจจุบัน)

ตัวเลือกสำคัญอื่นๆ

ตัวอย่างขั้นสูง

ลบไฟล์ใหญ่กว่า 100MB แบบ parallel:

find /data -type f -size +100M -print0 | xargs -0 -P4 rm -f

บีบอัด log ไฟล์เก่า 7 วัน:

find /var/log -name "*.log" -mtime +7 -print0 | xargs -0 gzip

เปลี่ยน owner หลายไฟล์:

find /home/user -type f -user olduser -print0 | xargs -0 chown newuser:newgroup

สรุป

xargs ทำให้ CLI workflow มีประสิทธิภาพ: จัดการ argument 多, parallel processing, ป้องกัน error จากชื่อไฟล์แปลก ควรจดจำ -r, -n1, -I, -0, -P จะชีวิตง่ายขึ้นมาก

Optionคำอธิบาย
-n Nใช้ max N arguments ต่อการรันคำสั่ง 1 ครั้ง
-P Nรันแบบ parallel N processes พร้อมกัน (เร็วขึ้นบน multi-core)
-0Input คั่นด้วย null (\0) แทน whitespace - ใช้กับ find -print0 ปลอดภัยสำหรับชื่อไฟล์มี space
-tพิมพ์คำสั่งที่จะรันก่อนรันจริง (debug)
-pPrompt ยืนยันก่อนรันแต่ละคำสั่ง