คำถามติดแท็ก xargs

13
ทำให้ xargs ดำเนินการคำสั่งหนึ่งครั้งสำหรับแต่ละบรรทัดอินพุต
ฉันจะทำให้ xargs เรียกใช้งานคำสั่งได้อย่างแม่นยำเพียงครั้งเดียวสำหรับแต่ละอินพุตที่ได้รับอย่างไร มันเป็นพฤติกรรมเริ่มต้นคือการ chunk บรรทัดและรันคำสั่งหนึ่งครั้งผ่านหลายบรรทัดไปยังแต่ละอินสแตนซ์ จากhttp://en.wikipedia.org/wiki/Xargs : find / path -type f -print0 | xargs -0 rm ในตัวอย่างนี้ค้นหาฟีดอินพุตของ xargs ด้วยรายการชื่อไฟล์แบบยาว xargs จากนั้นแยกรายการนี้เป็นรายการย่อยและเรียก rm หนึ่งครั้งสำหรับทุกรายการย่อย สิ่งนี้มีประสิทธิภาพมากกว่าเวอร์ชั่นที่เทียบเท่ากับการใช้งานจริง: ค้นหา / เส้นทาง -type f -exec rm '{}' \; ฉันรู้ว่าการค้นหามีธง "exec" ฉันแค่ยกตัวอย่างตัวอย่างจากแหล่งข้อมูลอื่น
341 xargs 

10
การรันหลายคำสั่งด้วย xargs
cat a.txt | xargs -I % echo % ในตัวอย่างข้างต้น xargs ใช้echo %เป็นอาร์กิวเมนต์คำสั่ง แต่ในบางกรณีฉันต้องการคำสั่งหลายคำสั่งเพื่อดำเนินการโต้แย้งแทนคำสั่งเดียว ตัวอย่างเช่น: cat a.txt | xargs -I % {command1; command2; ... } แต่ xargs ไม่ยอมรับแบบฟอร์มนี้ ทางออกหนึ่งที่ฉันรู้คือฉันสามารถกำหนดฟังก์ชั่นเพื่อห่อคำสั่งได้ แต่มันไม่ใช่ไพพ์ไลน์ฉันไม่ชอบมัน มีวิธีแก้ไขปัญหาอื่นอีกหรือไม่
310 bash  xargs 

12
ทำให้ xargs จัดการกับชื่อไฟล์ที่มีช่องว่าง
$ ls *mp3 | xargs mplayer Playing Lemon. File not found: 'Lemon' Playing Tree.mp3. File not found: 'Tree.mp3' Exiting... (End of file) คำสั่งของฉันล้มเหลวเนื่องจากไฟล์ "Lemon Tree.mp3" มีช่องว่างดังนั้น xargs จึงคิดว่าเป็นสองไฟล์ ฉันสามารถค้นหา + xargs ใช้งานชื่อไฟล์ได้ไหม
252 shell  find  xargs 

22
ฉันจะใช้ xargs เพื่อคัดลอกไฟล์ที่มีช่องว่างและเครื่องหมายคำพูดในชื่อได้อย่างไร
ฉันพยายามคัดลอกไฟล์หลายไฟล์ด้านล่างไดเรกทอรีและไฟล์จำนวนหนึ่งมีช่องว่างและเครื่องหมายคำพูดเดี่ยวในชื่อของพวกเขา เมื่อฉันพยายามสตริงด้วยกันfindและgrepด้วยxargsฉันได้รับข้อผิดพลาดต่อไปนี้: find .|grep "FooBar"|xargs -I{} cp "{}" ~/foo/bar xargs: unterminated quote คำแนะนำใด ๆ สำหรับการใช้งาน xargs ที่มีประสิทธิภาพยิ่งขึ้น นี้คือบนMac OS X 10.5.3 (Leopard) กับ xargsBSD

6
วิธีละเว้นคำสั่ง xargs หากอินพุต stdin ว่างเปล่า?
พิจารณาคำสั่งนี้: ls /mydir/*.txt | xargs chown root ความตั้งใจที่จะเปลี่ยนเจ้าของไฟล์ข้อความทั้งหมดmydirเป็นรูท ปัญหาคือว่าถ้าไม่มี.txtไฟล์ในmydirxargs แล้ว thows ข้อผิดพลาดบอกว่าไม่มีเส้นทางที่ระบุ นี่เป็นตัวอย่างที่ไม่เป็นอันตรายเนื่องจากมีข้อผิดพลาดเกิดขึ้น แต่ในบางกรณีเช่นในสคริปต์ที่ฉันต้องใช้ที่นี่พา ธ ว่างจะถือว่าเป็นไดเรกทอรีปัจจุบัน ดังนั้นถ้าฉันเรียกใช้คำสั่ง/home/tom/นั้นถ้าไม่มีผลลัพธ์ls /mydir/*.txtและไฟล์ทั้งหมดภายใต้/home/tom/มีเจ้าของเปลี่ยนเป็นรูต ดังนั้นฉันจะให้ xargs เพิกเฉยกับผลลัพธ์ที่ว่างเปล่าได้อย่างไร
189 bash  centos  xargs 

4
การเรียกฟังก์ชันเชลล์ด้วย xargs
ฉันพยายามใช้ xargs เพื่อเรียกใช้ฟังก์ชันที่ซับซ้อนมากขึ้นในแบบคู่ขนาน #!/bin/bash echo_var(){ echo $1 return 0 } seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {} exit 0 ส่งคืนข้อผิดพลาด xargs: echo_var: No such file or directory ความคิดใด ๆ เกี่ยวกับวิธีที่ฉันสามารถใช้ xargs เพื่อทำให้สิ่งนี้สำเร็จมิเช่นนั้นจะยินดีต้อนรับทางออกอื่น ๆ
168 bash  sh  xargs 

3
วิธีใช้> ในคำสั่ง xargs
ฉันต้องการค้นหาคำสั่ง bash ที่จะให้ฉัน grep ทุกไฟล์ในไดเรกทอรีและเขียนผลลัพธ์ของ grep นั้นไปยังไฟล์แยกต่างหาก ฉันเดาว่าจะต้องทำอะไรแบบนี้ ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out" แต่เท่าที่ฉันรู้ xargs ไม่ชอบอัญประกาศ อย่างไรก็ตามหากฉันลบเครื่องหมายคำพูดคู่ออกคำสั่งจะเปลี่ยนทิศทางเอาต์พุตของคำสั่งทั้งหมดไปยังไฟล์เดียวที่เรียกว่า '{}' ออกแทนที่จะเป็นชุดไฟล์แต่ละไฟล์ ไม่มีใครรู้วิธีการทำเช่นนี้โดยใช้ xargs? ฉันเพิ่งใช้สถานการณ์ grep นี้เป็นตัวอย่างเพื่อแสดงปัญหาของฉันกับ xargs ดังนั้นการแก้ปัญหาใด ๆ ที่ไม่ได้ใช้ xargs นั้นไม่เหมาะสมสำหรับฉัน
160 bash  redirect  xargs 

2
การรันโปรแกรมแบบขนานโดยใช้ xargs
ขณะนี้ฉันมีสคริปต์ปัจจุบัน #!/bin/bash # script.sh for i in {0..99}; do script-to-run.sh input/ output/ $i done ฉันต้องการรันแบบขนานโดยใช้ xargs ฉันเหนื่อย script.sh | xargs -P8 แต่การดำเนินการข้างต้นจะดำเนินการเพียงครั้งเดียวในเวลานั้น ไม่มีโชคกับ -n8 ด้วย การเพิ่ม & ที่ท้ายบรรทัดเพื่อดำเนินการในสคริปต์สำหรับลูปจะพยายามเรียกใช้สคริปต์ 99 ครั้งพร้อมกัน ฉันจะดำเนินการลูปเพียง 8 ครั้งในขณะนั้นได้อย่างไรรวมถึง 100
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.