xargs มีประโยชน์อย่างยิ่งเมื่อคุณมีรายการพา ธ ของไฟล์บน stdin และต้องการทำบางสิ่งกับมัน ตัวอย่างเช่น:
$ git ls-files "*.tex" | xargs -n 1 sed -i "s/color/colour/g"
ลองตรวจสอบทีละขั้นตอนนี้:
$ git ls-files "*.tex"
tex/ch1/intro.tex
tex/ch1/motivation.tex
....
กล่าวอีกนัยหนึ่งอินพุตของเราคือรายการเส้นทางที่เราต้องการทำบางสิ่ง
หากต้องการทราบว่า xargs ทำอะไรกับพา ธ เหล่านี้เคล็ดลับที่ดีคือการเพิ่มecho
ก่อนคำสั่งของคุณเช่น:
$ git ls-files "*.tex" | xargs -n 1 echo sed -i "s/color/colour/g"
sed -i "s/color/colour/g" tex/ch1/intro.tex
sed -i "s/color/colour/g" tex/ch1/motivation.tex
....
-n 1
อาร์กิวเมนต์จะทำให้ xargs เปิดแต่ละบรรทัดลงในคำสั่งของตัวเอง sed -i "s/color/colour/g"
คำสั่งจะแทนที่เกิดขึ้นทั้งหมดcolor
ด้วยcolour
สำหรับไฟล์ที่ระบุ
โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะในกรณีที่คุณไม่มีช่องว่างในเส้นทางของคุณ หากคุณทำคุณควรใช้เส้นทางที่สิ้นสุดด้วยค่า null เป็นอินพุตไปยัง xargs โดยผ่าน-0
แฟล็ก ตัวอย่างการใช้จะเป็น:
$ git ls-files -z "*.tex" | xargs -0 -n 1 sed -i "s/color/colour/g"
ซึ่งทำเช่นเดียวกับที่เราอธิบายไว้ข้างต้น แต่ยังทำงานได้หากหนึ่งในเส้นทางนั้นมีช่องว่างอยู่
นี้ทำงานร่วมกับคำสั่งใด ๆ ที่ก่อให้ชื่อไฟล์เป็นผลผลิตเช่นหรือfind
locate
หากคุณใช้งานมันในที่เก็บ git ที่มีไฟล์จำนวนมากมันอาจจะมีประสิทธิภาพมากกว่าที่จะใช้มันgit grep -l
แทนgit ls-files
เช่น:
$ git grep -l "color" "*.tex" | xargs -n 1 sed -i "s/color/colour/g"
git grep -l "color" "*.tex"
คำสั่งจะให้รายการ "* .tex" ไฟล์ที่มีวลีที่ว่า "สี" แล้ว
xargs
และ$(...)
) xargs นั้นปลอดภัยกว่าการทดแทนคำสั่ง และฉันไม่สามารถจำได้ว่าเคยเจอชื่อไฟล์ที่ถูกกฎหมายกับการขึ้นบรรทัดใหม่ในนั้น การหลบหนีและการขยายคำไม่เป็นปัญหากับการทดแทนคำสั่งไม่ใช่ xargs หรือไม่