การใช้ xargs กับอินพุตจากไฟล์


41

สมมติว่าฉันมีไฟล์ดังต่อไปนี้

bob
john
sue

ตอนนี้เหล่านี้ corrospond โดยตรงไป (ในกรณีนี้) รูปแบบ URL เช่นhttp://example.com/persons/bob.tar, ,john.tarsue.tar

xargsผมอยากจะใช้เส้นเหล่านี้และเรียกพวกเขาผ่าน ฉันไม่รู้ว่าสิ่งใดที่ส่งผ่านไปยังคำสั่งที่ถูกเรียกใช้งาน ฉันจะเข้าถึงพารามิเตอร์ได้อย่างไรจากพรอมต์ (บอกว่าฉันต้องการสะท้อนแต่ละบรรทัดเช่นcat file | xargs echo $PARAM) หรือจากสคริปต์ทุบตี


ฉันยังไม่ได้ทำตามคำถามขออภัย โดยเฉพาะฉันไม่แน่ใจว่า "ฉันไม่รู้ว่าสิ่งใดที่ส่งผ่านไปยังคำสั่งที่ถูกประหารชีวิต" หมายความว่า
Michael Mrozek

1
@Michael: เมื่อคุณเรียกใช้รายการxargsมันจะแบ่งมันทีละบรรทัดและป้อนแต่ละบรรทัดลงในคำสั่งใช่ไหม? ฉันจะเข้าถึงสิ่งนั้นได้อย่างไรถ้าฉันต้องการพูดอะไรเช่นcat file | xargs curl http://example.com/[PASSED FROM FILE].tarนี้
Josh K

คำตอบ:


69

คำตอบของ Michael นั้นถูกต้องและควรแก้ไขปัญหาของคุณ เล่น

cat file | xargs -I % curl http://example.com/persons/%.tar

จะดาวน์โหลดไฟล์bob.tar john.tar. sue.tarตามที่คาดไว้

แต่ : แมวที่นี่จะไม่ได้ผล

ค่อนข้างใช้:

<file xargs -I % curl http://example.com/persons/%.tar

1
ในตัวอย่างไฟล์ของฉันหนึ่งมันอาจจะไม่เหมาะอย่างไรcat xaa xab xac xad ... xargs ...
จอชเค

10
@Josh ด้วยเหตุผลบางอย่างผู้คนมักจะใช้แมวอย่างจริงจังโดยไม่จำเป็น ตอนนี้ฉันถูกลงคะแนนสองครั้งแล้ว
Michael Mrozek

2
สำหรับบันทึกคุณได้รับ +1 จากฉัน ผมคิดว่าใช้catดีจริงๆเช่นเดียวกับการเพิ่มข้อมูลเพิ่มเติม ... :)
สเตฟาน

แน่นอนมันควรจะเป็นxargs -I % curl …( ตัวเลือกxargsมาก่อนcurlและตัวเลือก / ข้อโต้แย้ง) อย่างน้อยที่สุดxargs curl -I %(ที่-I %มีความหมายว่าเป็นตัวเลือกในการxargs , ไม่ม้วน ) ไม่ได้พกพา
Chris Johnsen

@ Chris, จับดี, tnx แก้ไขแล้ว.
สเตฟาน

16

ฉันคิดว่าคุณกำลังถามวิธีแทรกแต่ละบรรทัดที่ดึงมาจากxargs'stdin ที่อยู่ตรงกลางของคำสั่งแทนที่จะวางไว้ตรงปลายสุดเสมอ ถ้าเป็นเช่นนั้น-Iธงจะreplacement-stringโต้แย้ง xargsจะแทนที่replacement-stringในคำสั่งด้วยบรรทัดที่อ่านจาก stdin:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar

เอาล่ะวิธีการเกี่ยวกับcurl http://example.com/foobar.tar > foobar.tar?
Josh K

2
@ Josh K: เป็นโครงสร้างเปลือกและจะไม่ทำงาน> xargsในทางกลับกันcurl -oจะเขียนไปยังไฟล์ที่มีชื่อแทน stdout เช่นเดียวกับที่wgetทำดังนั้นนั่นอาจเป็นสิ่งที่คุณต้องการใช้ที่นี่
ephemient

9
$ man xargs
...
       --arg-file = ไฟล์
       -ไฟล์
              อ่านรายการจากไฟล์แทนอินพุตมาตรฐาน ถ้าคุณใช้สิ่งนี้
              ตัวเลือก stdin ยังคงไม่เปลี่ยนแปลงเมื่อมีการเรียกใช้คำสั่ง Other-
              wise stdin ถูกเปลี่ยนเส้นทางจาก / dev / null
...

คุณอาจต้องการชุด--delimiter=/ -dการ'\n'ได้เป็นอย่างดี


ในทางกลับกันหากคุณเพียงแค่พยายามเปลี่ยนแต่ละบรรทัดในไฟล์ให้เป็น URL

$ sed -e 's #. * # http: //example.com/persons/&.tar#' ไฟล์

จะทำและถ้าคุณต้องการที่จะดึงข้อมูลทั้งหมดของพวกเขาเพียงแค่ท่อที่เป็น| wget -i


8

อีกวิธีด้วยการวนรอบเชลล์:

for i in `cat file`; do curl -I http://foo.com/$i; done

คุณยังสามารถเรียกใช้การวนซ้ำแต่ละครั้งในพื้นหลังโดยต่อท้าย&ก่อนอัฒภาคสุดท้าย - สำหรับการดาวน์โหลดที่มีขนาดใหญ่มากสิ่งนี้อาจมีประโยชน์


2
คุณได้ตกหลุมรักความผิดพลาดแบบคลาสสิกอย่างใดอย่างหนึ่งแล้ว ! <- ลิงค์เสียนี่เป็นเวอร์ชันแคช: การใช้ประโยชน์ของรางวัลแมว
Sorpigal

@Sorpigal URL นั้นเสีย 'Classic Blunder' คืออะไร
starbeamrainbowlabs

@ starbeamrainbowlabs - การใช้แมวที่ไร้ประโยชน์ฉันได้ใส่ลิงค์แคชไว้ในความคิดเห็นด้านบน
slm

@ starbeamrainbowlabs: ฉันกำลังเชื่อมโยงกับBackticks ที่เป็นอันตรายโดยเฉพาะ แต่การใช้แมวก็ไม่มีความจำเป็นเช่นกันถ้าคุณเปลี่ยนเป็นโครงสร้างในขณะที่:while IFS= read i ; do curl ... ; done < file
Sorpigal

3

ด้วย GNU Parallel คุณสามารถทำได้:

cat urls | parallel curl {} ">" {/}

หรือ:

cat persons | parallel curl http://example.com/persons/{}.tar ">" {}.tar

ดูวิดีโอแนะนำสำหรับ GNU Parallel เพื่อเรียนรู้เพิ่มเติม: http://www.youtube.com/watch?v=OpaiGYxkSuQ


1

while read VAR; do ... done วนซ้ำง่าย แต่หลากหลายมาก:

while read word; do wget http://example.com/persons/$word; done < file

0

นี่เป็นคำตอบทั่วไปของ Stefan: แต่ฉันใช้ awk ตรงกลางเพื่อเตรียม "string" ที่แน่นอนที่ฉันต้องการให้ xargs ดำเนินการ และ xargs ใช้ bash เพื่อทำ "งาน" จริง ๆ

มันเป็น overkill เล็กน้อยสำหรับตัวอย่างนี้ แต่เป็นวิธีแก้ไขปัญหาทั่วไปที่มีการแก้ไขบางอย่างสามารถแก้ปัญหามากมาย ...

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.