คำสั่ง xargs: วิธีใช้ ตัวเลือก -n และ -I และการใช้ร่วมกับ find

สภาพแวดล้อมทดสอบตระกูล RHELAlmaLinux 9.8บัญชี rootตรวจสอบเมื่อ 2026-10-29

คำสั่ง xargs คือเครื่องมือ Linux ที่เปลี่ยนบรรทัดและคำจากอินพุตมาตรฐานให้เป็นอาร์กิวเมนต์ของคำสั่งอื่นแล้วรันคำสั่งนั้น เมื่อเราส่งไฟล์ล็อก 3 ไฟล์ที่ find พบไปให้ wc ผ่าน xargs ในโฟลเดอร์ทำงานบนเซิร์ฟเวอร์ AlmaLinux 9 ไฟล์ที่มีช่องว่างในชื่อถูกแยกเป็นสองส่วนจนเกิดข้อผิดพลาด และเมื่อใส่ -print0 กับ -0 จำนวนบรรทัดของทั้ง 3 ไฟล์ก็แสดงครบ

เอาต์พุตด้านล่างรันในโฟลเดอร์ทำงานด้วยบัญชี root บนเซิร์ฟเวอร์ AlmaLinux 9.8 รายชื่อ ล็อก และไฟล์ชั่วคราวเป็นไฟล์ตัวอย่างที่สร้างไว้ทดสอบ ส่วนที่อยู่ IP และพาธโฟลเดอร์ในไฟล์เหล่านั้นก็เป็นค่าตัวอย่าง

1️⃣ วิธีใช้พื้นฐานของคำสั่ง xargs

  • ↪️ อินพุตมาตรฐานเป็นอาร์กิวเมนต์ของคำสั่ง

xargs แบ่งอินพุตมาตรฐานจากคำสั่งก่อนหน้าตามช่องว่างและการขึ้นบรรทัดใหม่ แล้วรันคำสั่งที่เขียนไว้ข้างหลังโดยใส่ส่วนเหล่านั้นเป็นอาร์กิวเมนต์ เราตรวจสอบด้วย names.txt ที่มีชื่อบรรทัดละหนึ่งชื่อ

cat names.txt
alice
bob
carol
dave
erin

เมื่อส่งเอาต์พุตของ cat ให้ xargs echo ทั้งห้าบรรทัดจะเป็นอาร์กิวเมนต์ของ echo ครั้งเดียวและแสดงเป็นบรรทัดเดียว

cat names.txt | xargs echo
alice bob carol dave erin

ถ้าไม่เขียนคำสั่งไว้ข้างหลัง xargs จะรัน echo ผลลัพธ์จึงเหมือนกัน

cat names.txt | xargs
alice bob carol dave erin

ไปป์เชื่อมเอาต์พุตของคำสั่งก่อนหน้ากับอินพุตมาตรฐานของคำสั่งถัดไป จึงไม่มีอะไรเข้าไปในอาร์กิวเมนต์ของคำสั่งถัดไป ถ้าส่ง list.txt ที่มีชื่อไฟล์สามชื่อให้ wc -l ผ่านไปป์อย่างเดียว wc จะนับ 3 บรรทัดของรายการเอง

cat list.txt
logs/access.log
logs/error.log
tmp/keep.txt
cat list.txt | wc -l
3

ถ้าคั่นด้วย xargs ชื่อทั้งสามในรายการจะเป็นอาร์กิวเมนต์ของ wc และแสดงจำนวนบรรทัดของแต่ละไฟล์

cat list.txt | xargs wc -l
  3 logs/access.log
  2 logs/error.log
  1 tmp/keep.txt
  6 total

2️⃣ ตัวเลือก -n และ -I ของ xargs

  • ↪️ ขนาดกลุ่ม ตำแหน่งอาร์กิวเมนต์ และการตรวจด้วย -t

ถ้าไม่มีตัวเลือก อินพุตทั้งหมดจะเข้าไปในคำสั่งครั้งเดียว ถ้าต้องการรันซ้ำให้กำหนดจำนวนอาร์กิวเมนต์ต่อครั้งด้วย -n ภาพด้านล่างแสดงว่าชื่อทั้งห้าเดียวกันถูกจัดกลุ่มอย่างไรตามตัวเลือก

🧩 วิธีที่ xargs จัดกลุ่มอินพุตมาตรฐานเป็นอาร์กิวเมนต์ของคำสั่ง
แผนภาพอธิบาย
⚙️ ตัวเลือก
$ cat names.txt | xargs echo
$ cat names.txt | xargs -n 2 echo
$ cat names.txt | xargs -I {} echo 'user: {}'
① อินพุตมาตรฐาน (names.txt)alicebobcaroldaveerinบรรทัดละหนึ่งชื่อ รวมห้าบรรทัด
② จัดกลุ่มเป็นอาร์กิวเมนต์alicebobcaroldaveerinถ้าไม่มีตัวเลือก ทั้งห้าจะเป็นกลุ่มเดียวalicebobcaroldaveerin-n 2 จัดกลุ่มทีละสอง ส่วนที่เหลือแยกเป็นอีกกลุ่มalicebobcaroldaveerin-I {} ให้หนึ่งบรรทัดเป็นหนึ่งกลุ่มแล้วใส่แทน {}
③ คำสั่งที่รันและเอาต์พุตecho alice bob carol dave erinalice bob carol dave erinecho รันหนึ่งครั้งecho alice bobecho carol daveecho erinecho รันสามครั้ง แสดงกลุ่มละหนึ่งบรรทัดecho 'user: alice' echo 'user: bob' … แบบเดียวกันห้าครั้งจนถึง erinuser: aliceuser: bobuser: caroluser: daveuser: erinecho รันห้าครั้ง โดยใส่ชื่อแทน {}
ถ้าไม่มีตัวเลือก xargs จะนำทุกคำจากอินพุตไปเป็นอาร์กิวเมนต์ของคำสั่งครั้งเดียว ชื่อทั้งห้าจึงเข้า echo ครั้งเดียวและแสดงเป็นบรรทัดเดียว
ถ้าใส่ -n 2 จะจัดคำทีละสองแล้วรันคำสั่งซ้ำ ชื่อทั้งห้าจะเป็นสามกลุ่ม echo จึงรันสามครั้ง
ถ้าใส่ -I {} จะถือหนึ่งบรรทัดเป็นหนึ่งหน่วย แล้วใส่บรรทัดนั้นแทน {} ในคำสั่งและรันทีละบรรทัด ใช้เมื่ออาร์กิวเมนต์ต้องอยู่ตำแหน่งอื่นที่ไม่ใช่ท้ายสุด

-n 1 รัน echo ทีละชื่อ จึงแสดงห้าบรรทัด

cat names.txt | xargs -n 1 echo
alice
bob
carol
dave
erin

-n 2 จัดกลุ่มทีละสอง และส่งส่วนที่เหลือแยกต่างหาก

cat names.txt | xargs -n 2 echo
alice bob
carol dave
erin

ถ้าต้องการเห็นคำสั่งที่รัน ให้ใส่ -t บรรทัดคำสั่งจะแสดงก่อนและเอาต์พุตตามมาด้านล่าง

cat names.txt | xargs -t -n 2 echo
echo alice bob
alice bob
echo carol dave
carol dave
echo erin
erin

ถ้าอาร์กิวเมนต์ต้องอยู่ตำแหน่งอื่นที่ไม่ใช่ท้ายคำสั่ง ให้กำหนดตัวยึดตำแหน่งด้วย -I แต่ละบรรทัดจะเข้าไปแทน {} และถ้าข้อความเดียวกันมีหลายที่ก็จะถูกแทนทั้งหมด

cat names.txt | xargs -I {} echo 'user: {}'
user: alice
user: bob
user: carol
user: dave
user: erin
cat names.txt | xargs -I {} echo '{} -> home/{}'
alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erin

ใช้วิธีเดียวกันสร้างโฟลเดอร์ตามชื่อได้ สร้างโฟลเดอร์ home ก่อน แล้วใช้ -I {} สร้างโฟลเดอร์ตามชื่อไว้ข้างใน จะได้ห้าโฟลเดอร์

mkdir home
cat names.txt | xargs -I {} mkdir home/{}
ls home
alice  bob  carol  dave  erin

-I ถือหนึ่งบรรทัดเป็นอาร์กิวเมนต์เดียว จึงใช้ร่วมกับ -n ไม่ได้ เมื่อเขียนทั้งคู่ -I ถูกละเว้นพร้อมคำเตือน และ {} ถูกแสดงตามตัวอักษร

cat names.txt | xargs -I {} -n 2 echo {}
xargs: warning: options --replace and --max-args/-n are mutually exclusive, ignoring previous --replace value
{} alice bob
{} carol dave
{} erin

-L จัดกลุ่มตามจำนวนบรรทัด ถ้าบรรทัดหนึ่งมีหลายคำ คำเหล่านั้นจะถูกส่งไปด้วยกัน และใน names.txt ที่มีบรรทัดละหนึ่งชื่อ -L 2 ให้ผลเหมือน -n 2

cat names.txt | xargs -L 2 echo
alice bob
carol dave
erin

3️⃣ การใช้ find ร่วมกับ xargs

  • ↪️ ส่งชื่อไฟล์ที่มีช่องว่างด้วย -print0 และ -0

ไม่ต้องสร้างรายชื่อเอง สามารถส่งไฟล์ที่ find พบให้ xargs ได้เลย เมื่อค้นหาไฟล์ที่ลงท้ายด้วย .log ในโฟลเดอร์ล็อกจะพบสามไฟล์ และหนึ่งในนั้นมีช่องว่างในชื่อ

find /root/work/logs -name '*.log'
/root/work/logs/access.log
/root/work/logs/error.log
/root/work/logs/old access.log

เมื่อส่งรายการนี้ให้ xargs wc -l โดยตรง ชื่อที่มีช่องว่างถูกแยกเป็น old และ access.log เกิดข้อผิดพลาดสองบรรทัด และผลรวมเป็น 5 บรรทัดจากสองไฟล์เท่านั้น

find /root/work/logs -name '*.log' | xargs wc -l
  3 /root/work/logs/access.log
  2 /root/work/logs/error.log
wc: /root/work/logs/old: No such file or directory
wc: access.log: No such file or directory
  5 total

-print0 ของ find คั่นชื่อด้วยอักขระ null แทนการขึ้นบรรทัดใหม่ และ -0 ของ xargs แบ่งอาร์กิวเมนต์ด้วยอักขระ null นั้นเท่านั้น เมื่อใช้ทั้งสองจะได้จำนวนบรรทัดครบสามไฟล์ รวมไฟล์ที่มีช่องว่างด้วย

find /root/work/logs -name '*.log' -print0 | xargs -0 wc -l
  3 /root/work/logs/access.log
  2 /root/work/logs/error.log
  1 /root/work/logs/old access.log
  6 total

ตัวเลือก -exec ของ find ทำงานเดียวกันได้ ถ้าใส่ + หลัง {} จะส่งไฟล์ที่พบไปครั้งเดียว ผลจึงเหมือนกัน และ find ส่งช่องว่างในชื่อไฟล์ไปตามเดิม xargs รับเอาต์พุตของคำสั่งอื่นได้ด้วย จึงใช้เมื่ออินพุตไม่ได้มาจาก find อย่างเดียว หรือเมื่อต้องกำหนดจำนวนต่อครั้ง (-n) หรือจำนวนการรันพร้อมกัน (-P)

find /root/work/logs -name '*.log' -exec wc -l {} +
  3 /root/work/logs/access.log
  2 /root/work/logs/error.log
  1 /root/work/logs/old access.log
  6 total

ถ้าต้องการเลือกเฉพาะไฟล์ที่มีสตริงจากไฟล์ที่พบ ให้ใส่ grep -l หลัง xargs ไฟล์ที่มี wp-login มีสองไฟล์ คือล็อกการเข้าถึงและล็อกข้อผิดพลาด

find /root/work/logs -name '*.log' -print0 | xargs -0 grep -l wp-login
/root/work/logs/access.log
/root/work/logs/error.log

4️⃣ การลบไฟล์ด้วยคำสั่ง xargs

  • ↪️ ดูก่อนด้วย echo และยืนยันด้วย -p

ถ้าใส่ rm หลัง xargs ไฟล์ที่พบจะถูกลบทีเดียว จึงควรตรวจก่อนลบว่าไฟล์ใดจะถูกส่งไป ถ้าใส่ echo หน้า rm จะแสดงเฉพาะบรรทัดคำสั่งที่จะรัน และไฟล์ยังอยู่เหมือนเดิม

find /root/work/tmp -name '*.tmp' -print0 | xargs -0 echo rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

ถ้าใส่ -p จะถามทุกคำสั่งว่าจะรันหรือไม่ ถ้าป้อน n จะไม่ลบอะไร ไฟล์ชั่วคราวทั้งสามยังอยู่

find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...n
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

ถ้าป้อน y ไฟล์ทั้งสามจะถูกลบ และเหลือเพียง keep.txt

find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...y
ls tmp
keep.txt

ถ้าอินพุตว่าง xargs จะรันคำสั่งหนึ่งครั้งโดยไม่มีอาร์กิวเมนต์ เมื่อส่งไฟล์ว่าง rm จะรันโดยไม่มีอาร์กิวเมนต์และเกิดข้อผิดพลาด [rm: missing operand] ถ้าใส่ -r คำสั่งจะไม่รันเลย

cat empty.txt | xargs rm
rm: missing operand
Try 'rm --help' for more information.
cat empty.txt | xargs -r rm

5️⃣ การรันแบบขนาน ตัวคั่น และตัวเลือกของ xargs

  • ↪️ ตัวเลือก -P, -d, -a

🔲 การรันแบบขนานและตัวคั่น

ถ้าคำสั่งรันทีละคำสั่ง เป้าหมายยิ่งมากก็ยิ่งใช้เวลานาน -P กำหนดจำนวนคำสั่งที่รันพร้อมกัน sleep สี่ตัวที่รอ 1, 2, 3 และ 4 วินาที ใช้เวลา 10 วินาทีเมื่อรันตามลำดับ และจบใน 4 วินาทีซึ่งนานที่สุดเมื่อรันพร้อมกันด้วย -P 4

time seq 1 4 | xargs -n 1 sleep

real	0m10.007s
user	0m0.004s
sys	0m0.003s
time seq 1 4 | xargs -n 1 -P 4 sleep

real	0m4.005s
user	0m0.001s
sys	0m0.006s

ถ้าอินพุตคั่นด้วยสัญลักษณ์อื่นที่ไม่ใช่การขึ้นบรรทัดใหม่หรือช่องว่าง ให้กำหนดตัวคั่นด้วย -d เมื่อแบ่งชื่อสามชื่อที่คั่นด้วยจุลภาคด้วย -d , จะแสดงชื่อละหนึ่งบรรทัด

printf 'alice,bob,carol' | xargs -d , -n 1 echo
alice
bob
carol

ถ้าต้องการอ่านจากไฟล์แทนอินพุตมาตรฐาน ให้เขียนชื่อไฟล์ที่ -a ชื่อทั้งห้าใน names.txt ถูกส่งให้ echo โดยไม่ใช้ไปป์

xargs -a names.txt echo
alice bob carol dave erin

🔲 ตัวเลือกของคำสั่ง xargs

📌 ตัวเลือกหลัก: ผลที่รันในบทความนี้

ตัวเลือกหน้าที่ผลที่เห็นในบทความนี้
-nกำหนดจำนวนอาร์กิวเมนต์ที่ส่งให้คำสั่งต่อครั้งชื่อทั้งห้าถูกจัดกลุ่มทีละสองด้วย -n 2 และ echo รันสามครั้ง
-Iใส่ทีละบรรทัดในตัวยึดตำแหน่งแล้วรันทีละบรรทัดใส่ชื่อแทน {} ถ้าเขียนร่วมกับ -n จะละเว้น -I พร้อมคำเตือน
-Lกำหนดจำนวนบรรทัดที่ส่งให้คำสั่งต่อครั้งในไฟล์ที่มีบรรทัดละหนึ่งชื่อ ให้ผลเหมือน -n 2
-tแสดงบรรทัดคำสั่งที่จะรันก่อนบรรทัดคำสั่งแสดงก่อนเอาต์พุต
-0แบ่งอินพุตด้วยอักขระ null เท่านั้น (ใช้กับ find -print0)ถ้าไม่ใส่ ชื่อที่มีช่องว่างจะถูกแยกและมีข้อผิดพลาดสองบรรทัด ถ้าใส่ ทั้งสามไฟล์ได้ 6 บรรทัด
-pถามทุกคำสั่งว่าจะรันหรือไม่n ไฟล์ยังอยู่ y ลบทั้งสามไฟล์
-rไม่รันคำสั่งถ้าอินพุตว่างถ้าไม่ใส่ได้ [rm: missing operand] ถ้าใส่จะไม่รัน
-Pกำหนดจำนวนคำสั่งที่รันพร้อมกันsleep สี่ตัว ตามลำดับ 10 วินาที ด้วย -P 4 ใช้ 4 วินาที
-dกำหนดตัวคั่นสำหรับแบ่งอินพุต-d , ได้ชื่อละหนึ่งบรรทัด
-aอ่านอินพุตจากไฟล์แทนอินพุตมาตรฐานชื่อทั้งห้าใน names.txt เข้า echo ครั้งเดียว

📎 ตัวเลือกอื่น: ตามคู่มือทางการ

ตัวเลือกหน้าที่
-sกำหนดจำนวนอักขระสูงสุดในบรรทัดคำสั่งหนึ่งบรรทัด
-xถ้าเกินขนาด -s จะจบโดยไม่รัน
-Eหยุดอ่านอินพุตเมื่อพบบรรทัดที่มีเฉพาะข้อความนี้
-oเปิดเทอร์มินัลใหม่เป็นอินพุตมาตรฐานของคำสั่ง (สำหรับโปรแกรมแบบโต้ตอบ)
--process-slot-varใส่หมายเลขต่างกันในตัวแปรสภาพแวดล้อมสำหรับแต่ละคำสั่งที่รันพร้อมกัน

🔲 ตัวจำลองคำสั่ง xargs

ในตัวจำลองด้านล่าง คุณพิมพ์คำสั่ง xargs และ find กับไฟล์ทดสอบชุดเดียวกันได้เอง

ตัวจำลองคำสั่ง xargsGNU findutils 4.8
[root@server work]#
ใช้ปุ่ม ↑↓ บนแป้นพิมพ์เพื่อเรียกคำสั่งที่พิมพ์ไว้ก่อนหน้ากลับมา

🔢 FAQ & เนื้อหาแนะนำ

ถ้าส่งหมายเลขโปรเซส kill จะส่งสัญญาณไปยังหมายเลขนั้น เมื่อดึงหมายเลขโปรเซสของ sleep 600 ที่รันในพื้นหลังด้วยตัวแปรเชลล์ $! แล้วส่งให้ xargs kill จะเหลือ [Terminated sleep 600] ในรายการงาน และงานหายไปเมื่อสั่ง jobs ครั้งถัดไป ถ้ารวบรวมรายการหมายเลขด้วยคำสั่งอื่น ให้แสดงก่อนว่ามีโปรเซสใดบ้างแล้วจึงส่ง

ตัวเลือก --show-limits แสดงขีดจำกัด บนเซิร์ฟเวอร์ที่ทดสอบ เพดาน POSIX ของความยาวบรรทัดคำสั่งคือ 2,093,890 ไบต์ และบัฟเฟอร์คำสั่งที่ xargs ใช้จริงคือ 131,072 ไบต์ ตามคู่มือ ถ้าอินพุตยาวกว่าบัฟเฟอร์นี้ xargs จะแบ่งคำสั่งเป็นหลายครั้ง

ถ้าคำสั่งที่ xargs รันล้มเหลวแม้เพียงคำสั่งเดียวด้วยรหัส 1 ถึง 125 รหัสออกของ xargs จะเป็น 123 ทั้งการรัน wc ที่ชื่อไฟล์ถูกแยกและการรัน rm ด้วยอินพุตว่างได้ 123 ส่วนกรณีหาคำสั่งไม่พบได้ 127 ใช้ค่านี้เป็นเกณฑ์เมื่อตรวจรหัสออกหลัง xargs ในเชลล์สคริปต์

🔗 เนื้อหาแนะนำ
การค้นหา · หาไฟล์ คำสั่ง find ของ Linux คำสั่ง find ใช้หาไฟล์ตามชื่อ ประเภท และเวลา เป็นคำสั่งที่วางหน้า xargs บ่อยที่สุด จึงควรอ่านต่อเมื่อต้องการขยายเงื่อนไขการค้นหา อ่านบทความ → คำสั่ง find ของ Linux (ในคอนโซล)

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 1   +   8   =