किसी फ़ाइल से इनपुट के साथ xargs का उपयोग करना


41

कहो कि मेरे पास निम्नलिखित के साथ एक फाइल है

bob
john
sue

अब इन सीधे corrospond जैसे URL पैटर्न (इस मामले में) http://example.com/persons/bob.tar, john.tar, sue.tar

मैं इन पंक्तियों को लेना चाहूंगा और उनके माध्यम से चलाऊंगा xargs। मुझे नहीं पता कि क्या किया जा रहा है हालांकि कमांड को पारित किया गया है। मैं या तो प्रॉम्प्ट से पैरामीटर का उपयोग कैसे कर सकता हूं (जैसे मैं प्रत्येक पंक्ति को प्रतिध्वनित करना चाहता हूं cat file | xargs echo $PARAM) या बैश स्क्रिप्ट से।


मैं काफी सवाल का पालन नहीं कर रहा हूँ, क्षमा करें। विशेष रूप से मैं सुनिश्चित नहीं हूं "मैं नहीं जानता कि क्या आदेश को पारित कर दिया है, हालांकि निष्पादित किया जा रहा" क्या मतलब है
माइकल Mrozek

1
@ मिचेल: जब आप xargsइसके माध्यम से एक सूची चलाते हैं तो यह लाइन से टूट जाती है और प्रत्येक पंक्ति को एक कमांड में फीड करती है, है ना? अगर मुझे कुछ कहने की ज़रूरत है तो मैं कैसे पहुँच सकता हूँ cat file | xargs curl http://example.com/[PASSED FROM FILE].tar?
जोश के

जवाबों:


70

माइकल का जवाब सही है, और आपकी समस्या का समाधान करना चाहिए। चल रहा है

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
@ जोश किसी कारण से लोग बिल्ली के अनावश्यक उपयोग को वास्तव में गंभीरता से लेते हैं; मैं इसके लिए दो बार अब downvoted किया गया है
माइकल Mrozek

2
रिकॉर्ड के लिए, आपको मुझसे +1 मिला। मुझे लगता है कि उपयोग catकरना वास्तव में ठीक है, बस अधिक जानकारी जोड़ना पसंद है ... :)
स्टीफन

निश्चित रूप से यह xargs -I % curl …( इसके विकल्प / तर्क से पहले xargs विकल्प) होना चाहिए curl। बहुत कम से कम xargs curl -I %(जहां xargs के-I % विकल्प के रूप में अभिप्रेत है , कर्ल नहीं ) पोर्टेबल नहीं है।
क्रिस जॉन्सन

@ क्रिस, अच्छा कैच, tnx। तय की।
स्टीफन

16

मुझे लगता है कि आप पूछ रहे हैं कि xargsएक कमांड के बीच में din स्टडिन ’ से खींची गई अलग-अलग लाइनों को कैसे डाला जाए, बजाय इसके कि इसे हमेशा अंत में चिपकाया जाए। यदि हां, तो -Iझंडा एक replacement-stringतर्क लेता है ; xargsतब replacement-stringस्टडिन से पढ़ी गई लाइन के साथ कमांड में बदलेंगे:

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

ठीक है, कैसे curl http://example.com/foobar.tar > foobar.tar?
जोश के

2
@ जोश के: >एक शेल कंस्ट्रक्शन है, और इसके लिए काम नहीं करेगा xargs। दूसरी ओर, curl -oस्टडआउट के बजाय एक नामित फ़ाइल को लिखेंगे, जैसे कि क्या wgetकरता है, इसलिए शायद यही है कि आप यहां क्या उपयोग करना चाहते हैं।
ephemient

9
$ आदमी xargs
...
       --arg-फ़ाइल = फ़ाइल
       -एक पंक्ति
              मानक इनपुट के बजाय फ़ाइल से आइटम पढ़ें। यदि आप इसका उपयोग करते हैं
              विकल्प, स्टैण्ड अपरिवर्तित रहता है जब कमांड चलाया जाता है। Other-
              वार, स्टड को / 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

आप &अंतिम अर्धविराम से पहले जोड़कर पृष्ठभूमि में प्रत्येक पुनरावृत्ति को चला सकते हैं - बहुत बड़े डाउनलोड के लिए यह आसान हो सकता है



@ सोरीगल वह यूआरएल टूट गया है। 'क्लासिक ब्लंडर' क्या है?
Starbeamrainbowlabs

@starbeamrainbowlabs - बिल्ली का बेकार उपयोग, मैंने ऊपर टिप्पणी में उस लिंक का कैश्ड संस्करण डाल दिया है।
स्लम

@starbeamrainbowlabs: मैं विशेष रूप से खतरनाक बैकटिक्स से लिंक कर रहा था , लेकिन अगर आप थोड़ी देर के लिए निर्माण करते हैं तो बिल्ली का उपयोग भी बेकार है:while IFS= read i ; do curl ... ; done < file
सोरपिगल

3

जीएनयू समानांतर के साथ आप कर सकते हैं:

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

या:

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

अधिक जानने के लिए GNU समानांतर के इंट्रो वीडियो देखें: 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

यह स्टीफन का एक अधिक सामान्य संस्करण है: उत्तर लेकिन मैं सटीक "स्ट्रिंग" तैयार करने के लिए बीच में awk का उपयोग कर रहा हूं जिसे मैं xargs को निष्पादित करना चाहूंगा। और फिर xargs वास्तविक "काम" करने के लिए बैश का उपयोग कर रहा है।

इस उदाहरण के लिए यह थोड़ा अधिक है, लेकिन यह एक सामान्य समाधान है कि कुछ संशोधनों के साथ कई समस्याएं हल हो सकती हैं ...

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.