एकल तर्क के लिए xargs --replace / -I


10

मैं प्रत्येक दिए गए तर्क के लिए कमांड चलाने के लिए xargs का उपयोग करने की कोशिश कर रहा हूं, लेकिन दुर्भाग्य से --replace / -I ध्वज -n के साथ संयुग्मित होने पर ठीक से काम नहीं करता है। ऐसा लगता है कि {} स्टैनड से पढ़े गए तर्कों की पूरी सूची में विस्तार करेगा, चाहे कोई भी विकल्प हो।

दुर्भाग्य से वेब पर सभी उदाहरण कमांड (mv, cp, rm) के लिए प्रतीत होते हैं जो कि कई तर्क लेगा जहाँ {} का विस्तार होता है।

उदाहरण के लिए, जब चल रहा हो:

echo a b c d | xargs -n 1 -I {} echo derp {}

आउटपुट है:

derp a b c d

लेकिन मुझे उम्मीद थी:

derp a
derp b
derp c
derp d

हालाँकि, इसे बिना चलाए -I {} अपेक्षित परिणाम देता है:

echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d

क्या xargs के साथ इसे प्राप्त करने का कोई तरीका है? मेरा अंतिम अभिप्राय बहु (पार्लेल) ssh सत्र चलाने के लिए इसका उपयोग करना है, जैसे

echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'

मैं xargs (GNU findutils) 4.4.2आरएचईएल 6.3 पर चल रहा हूं ।


2
दिलचस्प रूप से यह काम करता है जैसा कि आप बीएसडी के साथ करना चाहते हैं xargs, लेकिन जीएनयू नहीं xargs
slhck

1
man xargson -I: Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.तो यह डिजाइन के अनुसार व्यवहार करता है।
डैनियल बेक

@ एंड्रे, चूंकि आपका इरादा समानांतर में टैक चलाने का है, क्या आपने जीएनयू समानांतर पर एक नज़र डाली है? यह अच्छी तरह से काम करता है। अस्वीकरण: मैं इसे डेबियन के लिए पैकेज करता हूं।
राबिटो

जीएनयू समानांतर एक अच्छा प्रतिस्थापन की तरह लग रहा था, लेकिन दुर्भाग्य से मैं इसे इस विशेष मेजबान पर स्थापित नहीं कर सकता।
एंड्रे फर्नांडीस

जवाबों:


5

आप अपने अपेक्षित परिणाम को प्राप्त करने के लिए नई कहानियों के साथ प्रतिध्वनित कर सकते हैं। सर्वर विस्तार के साथ आपके मामले में यह होगा:

$ echo -e server{1..4}"\n" | xargs -I{} echo derp {}
derp server1
derp server2
derp server3
derp server4

नई लाइन का विचार समस्या के आसपास काम करता है (सिर्फ आपके सटीक उदाहरण के साथ नहीं): इको सर्वर {1..4} | tr '' '\ n' | xargs -I {} echo derp {} derp server1 derp server2 derp server3 derp server4
André Fernandes

क्षमा करें, इसके साथ परीक्षण किया गया zsh... मेरे उत्तर को निश्चित किया । विकल्प की echoजरूरत है -e

2

आप इस तरह एक अतिरिक्त पाइप का उपयोग कर सकते हैं,

echo a b c d | xargs -n1 | xargs -I{} echo derp {}
derp a
derp b
derp c
derp d

'-N1' विकल्प के कारण व्यक्तिगत रूप से xargs 'इकोस' के प्रत्येक अक्षर 'abcd' का मध्यवर्ती उपयोग। यह प्रत्येक अक्षर को इस तरह अपनी लाइन में रखता है,

echo a b c d | xargs -n1
a
b
c
d 

-I (स्ट्रिंग प्रतिस्थापन) का उपयोग करते समय यह समझना महत्वपूर्ण है, xargs का अर्थ है -L, जो प्रति पंक्ति एक बार उपयोगिता कमांड (आपके मामले में प्रतिध्वनि) को निष्पादित करता है। इसके अलावा, आप -L के साथ उपयोग नहीं कर सकते हैं क्योंकि वे परस्पर अनन्य हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.