สำหรับผู้ใช้ที่มีประสบการณ์มากกว่าบางคน เรามักจะมองหาวิธีใหม่ๆ ในการทำงานอย่างชาญฉลาดและไม่ยากที่เทอร์มินัล xargs
เป็นคำสั่งที่มีประโยชน์ซึ่งทำหน้าที่เป็นสะพานเชื่อมระหว่างสองคำสั่ง อ่านเอาต์พุตของคำสั่งหนึ่งและดำเนินการคำสั่งอื่นด้วยรายการที่อ่าน คำสั่งนี้ใช้บ่อยที่สุดในสถานการณ์ที่ผู้ใช้กำลังค้นหารูปแบบ การลบและเปลี่ยนชื่อไฟล์ และอื่นๆ ที่นี่เราจะแสดงวิธีใช้ xargs
คำสั่งเพื่อประโยชน์ของคุณ
xargs คืออะไร?
ในรูปแบบพื้นฐาน xargs
อ่านข้อมูลจากอินพุตมาตรฐาน (หรือ STDIN) และดำเนินการคำสั่งอย่างน้อยหนึ่งครั้งด้วยรายการที่อ่าน มีการสาธิตง่ายๆ มากมาย แต่นี่คือตัวอย่างที่ฉันหมายถึง
หากต้องการมี xargs
รัน ls
คำสั่งในโฟลเดอร์ Documents ของฉัน ฉันจะเรียกใช้คำสั่งต่อไปนี้:
echo "Documents" | xargs ls
อักขระไปป์ |
กำลังวางท่ออะไรก็ตามที่มาก่อนนั้นเป็น STDIN สำหรับ xargs
.
จะเห็นว่า xargs
อ่านโฟลเดอร์เอกสารของฉันโดยไม่มีปัญหา นี่เป็นเพียงตัวอย่างหนึ่งของความสามารถของ xargs
คำสั่ง
ในขณะที่ xargs
คำสั่งสามารถใช้ในการดำเนินการบรรทัดคำสั่งต่างๆ มันมีประโยชน์มากเมื่อใช้กับ find
สั่งการ. ในบทความนี้ เราจะพูดถึงตัวอย่างที่เป็นประโยชน์เพื่อทำความเข้าใจว่า xargs
และ find
ใช้ร่วมกันได้
การดำเนินการที่เกี่ยวข้องกับหลายไฟล์
สมมติว่าคุณต้องการคัดลอกเนื้อหาของ “ref.txt” ไปยังไฟล์ข้อความทั้งหมดที่อยู่ในไดเร็กทอรี แม้ว่างานอาจต้องการให้คุณรันคำสั่งหลายคำสั่ง xargs
คำสั่งพร้อมกับ find
คำสั่งทำให้ง่าย ฉันมีไดเร็กทอรีทดสอบสองสามอัน ไฟล์หนึ่งมี “test0.txt” ซึ่งมีข้อความ และไดเร็กทอรีอื่นมีไฟล์ทดสอบอีก 10 ไฟล์ที่ไม่มีข้อความอยู่ในนั้น ถ้าฉันต้องการนำเนื้อหาของ test0.txt
และคัดลอกไปยังไฟล์ข้อความที่เหลือในไดเร็กทอรีอื่น ฉันจะเรียกใช้คำสั่งต่อไปนี้:
find ./test-dir1/ -name "*.txt" | xargs -n1 cp test0.txt
เพื่อให้เข้าใจคำสั่งที่แสดงด้านบน ให้แบ่งออกเป็นสองส่วน
ส่วนแรกคือ find ./test-dir1/ -name "*.txt"
ซึ่งค้นหาไฟล์ .txt ทั้งหมดที่มีอยู่ในไดเร็กทอรี “test-dir1” คุณสามารถระบุไดเร็กทอรีใดก็ได้ที่นี่
ส่วนที่สอง xargs -n1 cp test.txt
จะดึงเอาท์พุตของคำสั่งแรก (ชื่อไฟล์ผลลัพธ์) แล้วส่งต่อให้ cp
(คัดลอก) คำสั่งทีละรายการ โปรดทราบว่า -n
ตัวเลือกมีความสำคัญที่นี่ เนื่องจากเป็นคำสั่ง xargs
เพื่อใช้หนึ่งอาร์กิวเมนต์ต่อการดำเนินการ
เมื่อรวมกันแล้ว คำสั่งแบบเต็มจะคัดลอกเนื้อหาของ “test0.txt” ไปยังไฟล์ .txt ทั้งหมดในไดเร็กทอรี
การดำเนินการที่เกี่ยวข้องกับอาร์กิวเมนต์จำนวนมาก
ข้อดีอย่างหนึ่งที่สำคัญของการใช้ xargs
คือความสามารถในการจัดการกับอาร์กิวเมนต์จำนวนมาก ตัวอย่างเช่น ในขณะที่ลบไฟล์จำนวนมากในครั้งเดียว rm
คำสั่งบางครั้งจะล้มเหลวด้วย “รายการอาร์กิวเมนต์ยาวเกินไป " ข้อผิดพลาด. นั่นเป็นเพราะมันไม่สามารถจัดการกับข้อโต้แย้งที่ยาวเหยียดได้ กรณีนี้มักเกิดขึ้นเมื่อคุณมีไฟล์มากเกินไปในโฟลเดอร์ที่คุณต้องการลบ
สมมติว่าคุณมี PDF 75 ไฟล์ และคุณได้รับข้อผิดพลาดขณะพยายามลบ
ซึ่งสามารถแก้ไขได้ง่ายด้วย xargs
. หากต้องการลบไฟล์เหล่านี้ทั้งหมด ให้ใช้คำสั่งต่อไปนี้:
find ./test-dir2/ -type f -name "*.pdf" -print | xargs rm -f
การดำเนินการที่เกี่ยวข้องกับการค้นหารูปแบบ
นักพัฒนาซอฟต์แวร์และผู้ดูแลระบบทำการค้นหารูปแบบมากมายในขณะที่ทำงานบนบรรทัดคำสั่ง ตัวอย่างเช่น นักพัฒนาอาจต้องการดูไฟล์โปรเจ็กต์ที่แก้ไขตัวแปรหนึ่งๆ อย่างรวดเร็ว หรือผู้ดูแลระบบอาจต้องการดูไฟล์ที่ใช้พารามิเตอร์การกำหนดค่าระบบเฉพาะ ในสถานการณ์เหล่านี้ xargs
พร้อมกับ find
และ grep
ทำให้ทุกอย่างเป็นเรื่องง่ายสำหรับคุณ
ตัวอย่างเช่น หากต้องการค้นหาไฟล์ ".txt" ทั้งหมดที่มีสตริง "maketecheasier" ให้เรียกใช้คำสั่งต่อไปนี้:
find ./ -name "*.txt" | xargs grep "maketecheasier"
นี่คือผลลัพธ์ของคำสั่งที่สร้างบนระบบของฉัน
การดำเนินการตัด/คัดลอก
Xargs
พร้อมกับ find
คำสั่ง สามารถใช้เพื่อคัดลอกหรือย้ายชุดของไฟล์จากไดเร็กทอรีหนึ่งไปยังอีกไดเร็กทอรีหนึ่ง ตัวอย่างเช่น ในการย้ายไฟล์ข้อความทั้งหมดที่เก่ากว่า 10 นาทีจากไดเร็กทอรีปัจจุบันไปยังไดเร็กทอรีก่อนหน้า ให้ใช้คำสั่งต่อไปนี้:
find . -name "*.txt" -mmin +10 | xargs -n1 -I '{}' mv '{}' ../
-I
ตัวเลือกบรรทัดคำสั่งถูกใช้โดย xargs
คำสั่งเพื่อกำหนดแทนที่สตริงซึ่งจะถูกแทนที่ด้วยชื่อที่อ่านจากผลลัพธ์ของ find
สั่งการ. สตริงแทนที่คือ {}
แต่มันจะเป็นอะไรก็ได้ ตัวอย่างเช่น คุณสามารถใช้ “file” เป็นสตริงแทนที่ได้
find . -name "*.txt" -mmin 10 | xargs -n1 -I 'file' mv 'file' ./practice
วิธีบอก xargs ว่าควรเลิกเมื่อใด
สมมติว่าคุณต้องการแสดงรายการรายละเอียดของไฟล์ .txt ทั้งหมดที่มีอยู่ในไดเร็กทอรีปัจจุบัน ตามที่อธิบายไว้แล้ว สามารถทำได้ง่ายๆ โดยใช้คำสั่งต่อไปนี้:
find . -name "*.txt" | xargs ls -l
แต่มีปัญหาอย่างหนึ่งคือ xargs
คำสั่งจะดำเนินการ ls
คำสั่งแม้ว่า find
คำสั่งไม่พบไฟล์ .txt ใดๆ ต่อไปนี้เป็นตัวอย่าง
คุณจะเห็นได้ว่าไม่มีไฟล์ .txt ในไดเร็กทอรี แต่นั่นไม่ได้หยุด xargs
จากการดำเนินการ ls
สั่งการ. หากต้องการเปลี่ยนพฤติกรรมนี้ ให้ใช้ -r
ตัวเลือกบรรทัดคำสั่ง:
find . -name "*.txt" | xargs -r ls -l
บทสรุป
แม้ว่าฉันจะจดจ่ออยู่กับการใช้ xargs
ด้วย find
นอกจากนี้ยังสามารถใช้กับคำสั่งอื่นๆ ได้อีกด้วย หากคุณมีคำสั่งที่ซับซ้อนหลายคำสั่งที่คุณต้องดำเนินการ xargs
เป็นเครื่องมือที่มีประโยชน์มาก
หากคุณสนุกกับการเขียนเกี่ยวกับวิธีใช้ xargs
คำสั่งใน Linux อย่าลืมตรวจสอบเนื้อหา Linux อื่นๆ ของเรา เช่น คำแนะนำในการแก้ไขข้อผิดพลาด “ไม่มีพื้นที่เหลือบนอุปกรณ์” หรือเร่งความเร็วของ Ubuntu