สามารถทำได้จากการfind
ใช้โดยตรง-exec
:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
สิ่งที่ถูกส่งไปยัง-exec
จะถูกเรียกใช้หนึ่งครั้งต่อไฟล์ที่พบโดยพารามิเตอร์เทมเพลต{}
จะถูกแทนที่ด้วยชื่อไฟล์ปัจจุบัน \;
ในตอนท้ายของการค้นหาคำสั่งเพียงแค่สิ้นสุดบรรทัด
การใช้xargs
ไม่จำเป็นจริงๆในกรณีนี้เพราะเราจำเป็นต้องเรียกใช้xmllint
หนึ่งครั้งต่อไฟล์เนื่องจากต้องระบุทั้งชื่ออินพุตและไฟล์เอาต์พุตในการโทรเดียวกัน
xargs
จะต้องใช้ถ้าคำสั่งที่ถูกไพพ์ไปยังจาก find กำลังทำงานกับหลายไฟล์พร้อมกันและรายการนั้นยาว คุณไม่สามารถทำเช่นนั้นในกรณีนี้ตามที่คุณต้องการที่จะผ่านชื่อไฟล์เดียวกับตัวเลือกของ--output
xmllint
หากไม่มีxargs
ข้อผิดพลาด "รายการอาร์กิวเมนต์ยาวเกินไป" หากคุณกำลังประมวลผลไฟล์จำนวนมาก xargs
ยังรองรับไฟล์แทนที่สตริงด้วย-I
ตัวเลือก:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
จะทำเช่นเดียวกันกับfind -exec
คำสั่งด้านบน ถ้าใด ๆ ของโฟลเดอร์ของคุณมีตัวอักษรแปลกในพื้นที่เช่นคุณจะต้องใช้-0
ตัวเลือกของและfind
xargs
แต่การใช้xargs
ที่มี-I
นัยตัวเลือก-L 1
ซึ่งหมายถึงเฉพาะการประมวลผล 1 ไฟล์ในเวลาอยู่แล้วดังนั้นคุณอาจรวมทั้งโดยตรงใช้กับfind
-exec