ฉันอยากรู้ว่าอะไรคือความแตกต่างระหว่างสิ่งนี้
ls | xargs rm
ls | xargs -i{} rm {}
ทั้งคู่ทำงานเพื่อฉัน
ฉันอยากรู้ว่าอะไรคือความแตกต่างระหว่างสิ่งนี้
ls | xargs rm
ls | xargs -i{} rm {}
ทั้งคู่ทำงานเพื่อฉัน
คำตอบ:
xargs rmจะเรียกใช้rmโดยมีอาร์กิวเมนต์ทั้งหมดเป็นพารามิเตอร์ที่เว้นวรรคด้วยช่องว่าง
xargs -i{} rm {}จะเรียกใช้rm {}สำหรับแต่ละอาร์กิวเมนต์และ{}จะถูกแทนที่ด้วยอาร์กิวเมนต์ปัจจุบัน
ถ้าคุณมี 2 ข้อโต้แย้งa.txtและb.txt, xargs rm จะเรียกสิ่งนี้ว่า
rm a.txt b.txt
แต่xargs -i{} rm {}จะโทร
rm a.txt
rm b.txt
นี่เป็นเพราะ-iตัวเลือกหมายถึง-L 1ตัวเลือกซึ่งหมายความว่าคำสั่งrmจะใช้เวลา1ในแต่ละบรรทัดเท่านั้น และที่นี่แต่ละบรรทัดมีเพียง 1 อาร์กิวเมนต์เท่านั้น
ตรวจสอบลิงค์ Ideoneนี้เพื่อรับแนวคิดเพิ่มเติมเกี่ยวกับมัน
rmมันไม่สำคัญ
ด้วยเครื่องมือจัดฟันมันจะวางไข่หนึ่งrmกระบวนการต่อไฟล์ หากไม่มีเครื่องหมายปีกกาxargsจะส่งชื่อไฟล์ให้มากที่สุดเท่าที่จะทำได้สำหรับแต่ละrmคำสั่ง
เปรียบเทียบ
ls | xargs echo
และ
ls | xargs -i echo '{}'
ตัวเลือก -i (เทียบเท่ากับ - แทนที่) สร้างการเรียงลำดับของตัวยึดตำแหน่งที่ xargs เก็บข้อมูลที่เพิ่งได้รับ ในคำสั่งที่สองของคุณตัวยึดตำแหน่งคือ "{}" มันทำงานเหมือนหาตัวเลือก -exec เมื่อกำหนดแล้ว xargs จะแทนที่ตัวยึดตำแหน่งนี้ด้วยอินพุตทั้งหมด หากคุณไม่ชอบชื่อ "{}" คุณสามารถกำหนดชื่อของคุณเอง:
ls | xargs -iPLACEHOLDER echo PLACEHOLDER
ในกรณีของคุณทั้งสองคำสั่งให้ผลลัพธ์เหมือนกัน ในรูปแบบที่สองคุณเพิ่งทำพฤติกรรมเริ่มต้นอย่างชัดเจนด้วยตัวเลือก -i