ฉันรู้ว่าฉันไม่ได้ตอบxargs
คำถามโดยตรงแต่ก็คุ้มค่าการกล่าวขวัญfind
ของ-exec
ตัวเลือก
รับระบบไฟล์ต่อไปนี้:
[root@localhost bokeh]# tree --charset assci bands
bands
|-- Dream\ Theater
|-- King's\ X
|-- Megadeth
`-- Rush
0 directories, 4 files
คำสั่ง find สามารถสร้างขึ้นเพื่อจัดการพื้นที่ใน Dream Theatre และ King's X ดังนั้นเพื่อค้นหามือกลองของแต่ละวงโดยใช้ grep:
[root@localhost]# find bands/ -type f -exec grep Drums {} +
bands/Dream Theater:Drums:Mike Mangini
bands/Rush:Drums: Neil Peart
bands/King's X:Drums:Jerry Gaskill
bands/Megadeth:Drums:Dirk Verbeuren
ใน-exec
ตัวเลือก{}
ย่อมาจากชื่อไฟล์รวมถึงเส้นทาง โปรดทราบว่าคุณไม่จำเป็นต้องหลบหนี
ความแตกต่างระหว่าง-exec
terminators ของ ( +
และ\;
) คือ+
กลุ่มที่เป็นชื่อไฟล์จำนวนมากที่มันสามารถลงบนบรรทัดคำสั่งเดียว โดยที่\;
จะรันคำสั่งสำหรับแต่ละชื่อไฟล์
ดังนั้นfind bands/ -type f -exec grep Drums {} +
จะส่งผลให้:
grep Drums "bands/Dream Theater" "bands/Rush" "bands/King's X" "bands/Megadeth"
และfind bands/ -type f -exec grep Drums {} \;
จะส่งผลให้:
grep Drums "bands/Dream Theater"
grep Drums "bands/Rush"
grep Drums "bands/King's X"
grep Drums "bands/Megadeth"
ในกรณีgrep
นี้มีผลข้างเคียงของการพิมพ์ชื่อไฟล์หรือไม่
[root@localhost bokeh]# find bands/ -type f -exec grep Drums {} \;
Drums:Mike Mangini
Drums: Neil Peart
Drums:Jerry Gaskill
Drums:Dirk Verbeuren
[root@localhost bokeh]# find bands/ -type f -exec grep Drums {} +
bands/Dream Theater:Drums:Mike Mangini
bands/Rush:Drums: Neil Peart
bands/King's X:Drums:Jerry Gaskill
bands/Megadeth:Drums:Dirk Verbeuren
แน่นอนgrep
เป็นตัวเลือก-h
และ-H
จะควบคุมหรือไม่ว่าชื่อไฟล์จะถูกพิมพ์โดยไม่คำนึงถึงวิธีการที่grep
เรียกว่า
xargs
xargs
ยังสามารถควบคุมว่าไฟล์ Man อยู่บนบรรทัดคำสั่งได้อย่างไร
xargs
โดยกลุ่มเริ่มต้นข้อโต้แย้งทั้งหมดลงในหนึ่งบรรทัด เพื่อที่จะทำสิ่งเดียวที่ไม่ใช้-exec \;
xargs -l
โปรดทราบว่า-t
ตัวเลือกบอกxargs
ให้พิมพ์คำสั่งก่อนดำเนินการ
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -l -t grep Drums
grep Drums ./bands/Dream Theater
Drums:Mike Mangini
grep Drums ./bands/Rush
Drums: Neil Peart
grep Drums ./bands/King's X
Drums:Jerry Gaskill
grep Drums ./bands/Megadeth
Drums:Dirk Verbeuren
ดูว่า-l
ตัวเลือกนั้นบอกให้ xargs เรียกใช้ grep สำหรับทุกชื่อไฟล์
กับค่าเริ่มต้น (เช่นไม่มี-l
ตัวเลือก):
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -t grep Drums
grep Drums ./bands/Dream Theater ./bands/Rush ./bands/King's X ./bands/Megadeth
./bands/Dream Theater:Drums:Mike Mangini
./bands/Rush:Drums: Neil Peart
./bands/King's X:Drums:Jerry Gaskill
./bands/Megadeth:Drums:Dirk Verbeuren
xargs
มีการควบคุมที่ดีขึ้นเกี่ยวกับจำนวนไฟล์ที่สามารถอยู่ในบรรทัดคำสั่ง ให้-l
ตัวเลือกจำนวนไฟล์สูงสุดต่อคำสั่ง
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -l2 -t grep Drums
grep Drums ./bands/Dream Theater ./bands/Rush
./bands/Dream Theater:Drums:Mike Mangini
./bands/Rush:Drums: Neil Peart
grep Drums ./bands/King's X ./bands/Megadeth
./bands/King's X:Drums:Jerry Gaskill
./bands/Megadeth:Drums:Dirk Verbeuren
[root@localhost bokeh]#
เห็นว่ากำลังดำเนินการมีสองชื่อไฟล์เพราะgrep
-l2
ls |grep mp3 |sed -n "7p"
ใช้ก็สามารถecho "Lemon Tree.mp3"
ใช้ได้