दिलचस्प पोस्ट
पायथन: लूप में सभी टेक्स्ट फाइल लाइन पढ़ें गीत में हेड, काम कर पेड़ और सूचकांक के बीच अंतर क्या है? मेमोरीस्ट्रीम खोलें (ज़िप फ़ाइल शामिल है) और फाइलें प्राप्त करें मैं मैक ओएस एक्स पर pyOpenSSL कैसे स्थापित करूं? Node.js + Nginx – अब क्या? बिटमैप पर स्पर्श का पता लगाएं जब मैं एच का प्रयोग करना चाहिए: h: commandLink के बजाय outputLink? सी ++ 11 स्टड :: क्रोनो टाइम_पॉइंट या इसी तरह की तारीख स्ट्रिंग को कैसे पार्स करना है? मैं NSAppTransportSecurity को अपने info.plist फ़ाइल में कैसे जोड़ सकता हूं? संदर्भित शैली विशेषताओं को ओवरराइड करना C ++ में चल प्रकारों में म्यूटक्स के साथ मैं कैसे व्यवहार करूँ? सी ++ कोड में डबल नाग गिट में "मूल" क्या है? एंड्रॉइड रिस्ट्रॉफ़्ट डिज़ाइन पैटर्न ऐप गेइटलेब के लिए एपाचे 2 प्रॉक्सीपैस

एकाधिक आज्ञाओं के साथ एक्सरग्स तर्क के रूप में

cat a.txt | xargs -I % echo % 

Xargs के ऊपर के उदाहरण में कमांड तर्क के रूप में echo % लेती हैं। लेकिन कुछ मामलों में, मुझे एक के बजाय प्रक्रिया करने के लिए एकाधिक आदेशों की आवश्यकता होती है, उदाहरण के लिए:

 cat a.txt | xargs -I % {command1; command2; ... } 

लेकिन एक्सएर्ग इस फॉर्म को स्वीकार नहीं करता है। एक हल मुझे पता है कि मैं आज्ञाओं को लपेटने के लिए एक फ़ंक्शन को परिभाषित कर सकता हूं, लेकिन यह पाइपलाइन नहीं है, मुझे इसे पसंद नहीं है। क्या कोई दूसरा समाधान है?

Solutions Collecting From Web of "एकाधिक आज्ञाओं के साथ एक्सरग्स तर्क के रूप में"

 cat a.txt | xargs -I % sh -c 'command1; command2; ...' 

ध्यान दें कि यह बिल्ली का बेकार उपयोग है मैं इसे लिखूंगा:

 < a.txt xargs -I % sh -c 'command1; command2; ...' 

(हां, रीडायरेक्शन कमांड की शुरुआत में हो सकता है।)

संभवतः command2 और / या command2 में एक या अधिक % वर्ण होंगे; अन्यथा xargs -I % विकल्प xargs को अधिक बिंदु नहीं होगा

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

 cat a.txt | parallel 'command1 {}; command2 {}; ...; ' 

अधिक जानने के लिए परिचय वीडियो देखें: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

कीथ के लिए +1 जवाब क्योंकि यह ओपी चाहता है क्या करता है

यह एक्सग्स और बिल्ली के बिना एक और तरीका है:

 while read stuff; do command1 "$stuff" command2 "$stuff" ... done < a.txt 

मैं जो एक काम करता हूं उसे .bashrc / .profile में जोड़ना है:

 function each() { while read line; do for f in "$@"; do $f $line done done } 

तो आप चीजों की तरह कर सकते हैं

 ... | each command1 command2 "command3 has spaces" 

जो xargs या -exec से कम शब्दावली है आप प्रत्येक को कमांड में एक मनमाना स्थान पर पढ़ने से मूल्य सम्मिलित करने के लिए फ़ंक्शन को संशोधित भी कर सकते हैं, अगर आपको उस व्यवहार की भी ज़रूरत है

आप उपयोग कर सकते हैं

 cat file.txt | xargs -i sh -c 'command {} | command2 {} && command3 {}' 

{} = पाठ फ़ाइल पर प्रत्येक पंक्ति के लिए चर

एक और संभावित समाधान जो मेरे लिए काम करता है वह कुछ ऐसा है –

 cat a.txt | xargs bash -c 'command1 $@; command2 $@' bash 

अंत में 'bash' को नोट करें – मुझे लगता है कि यह argv [0] के रूप में बीश के रूप में पारित किया गया है। इसके बिना इस वाक्य रचना में प्रत्येक कमांड के पहले पैरामीटर खो दिया है। यह कोई शब्द हो सकता है

उदाहरण:

 cat a.txt | xargs -n 5 bash -c 'echo -n `date +%Y%m%d-%H%M%S:` ; echo " data: " $@; echo "data again: " $@' bash 

पार्टी के लिए थोड़ा देर हो चुकी है

मैं अपनी निर्देशिकाओं को माइग्रेट करने से पहले हजारों छोटी फ़ाइलों के साथ मेरी निर्देशिका को सम्मिलित करने के लिए नीचे का उपयोग करता हूं। यदि आपको आदेशों के अंदर एकल उद्धरण की आवश्यकता नहीं है, तो उसे काम करना चाहिए

कुछ संशोधन के साथ, मुझे यकीन है कि यह किसी के लिए उपयोगी होगा साइगविन (बाबून) में परीक्षण किया गया

 find . -maxdepth 1 ! -path . -type d -print0 | xargs -0 -I @@ bash -c '{ tar caf "@@.tar.lzop" "@@" && echo Completed compressing directory "@@" ; }' 

find . यहां खोजें
-maxdepth 1 बाल निर्देशिकाओं में मत जाओ
! -path . निकालना । / वर्तमान निर्देशिका पथ
-type d मैच केवल निर्देशिकाएं
-print0 शून्य बाइट्स द्वारा अलग आउटपुट \ 0
| xargs | xargs पाइप करने के लिए xargs
-0 इनपुट शून्य अलग बाइट्स है
-I @@ प्लेसहोल्डर है @@ इनपुट के साथ @ @ बदलें
bash -c '...' भागो बैश आज्ञा
{...} कमांड समूहिंग
&& अगला अगली आज्ञा निष्पादित करें अगर पिछले कमांड सफलतापूर्वक बाहर निकल (बाहर निकलें 0)

अंतिम ; महत्वपूर्ण है, अन्यथा यह विफल हो जाएगा

आउटपुट:

 Completed compressing directory ./Directory1 with meta characters in it Completed compressing directory ./Directory2 with meta characters in it Completed compressing directory ./Directory3 with meta characters in it 

इसके लिए मेरा वर्तमान बीकेएम है

 ... | xargs -n1 -I % perl -e 'system("echo 1 %"); system("echo 2 %");' 

यह दुर्भाग्यपूर्ण है कि यह पर्ल का उपयोग करता है, जो कि बाश की तुलना में कम होने की संभावना है; लेकिन यह अधिक इनपुट संभालता है कि स्वीकार किए गए उत्तर (मैं सर्वव्यापी संस्करण का स्वागत करता हूं जो कि पर्ल पर भरोसा नहीं करता।)

@ कीथमॉम्पसन का सुझाव

  ... | xargs -I % sh -c 'command1; command2; ...' 

महान है – जब तक आपके पास शेल टिप्पणी वर्ण # आपके इनपुट में नहीं है, उस स्थिति में पहले कमांड का हिस्सा और दूसरी कमांड काट दिया जाएगा

Hashes # काफी सामान्य हो सकता है, अगर इनपुट को फाइल सिस्टम लिस्टिंग से प्राप्त किया जाता है, जैसे कि एलएस या ढूंढें, और आपका संपादक अस्थायी फाइलें उनके नाम पर # के साथ बनाता है

समस्या का उदाहरण:

 $ bash 1366 $> /bin/ls | cat #Makefile# #README# Makefile README 

ओह, यहां समस्या है:

 $ bash 1367 $> ls | xargs -n1 -I % sh -i -c 'echo 1 %; echo 2 %' 1 1 1 1 Makefile 2 Makefile 1 README 2 README 

आह, यह बेहतर है:

 $ bash 1368 $> ls | xargs -n1 -I % perl -e 'system("echo 1 %"); system("echo 2 %");' 1 #Makefile# 2 #Makefile# 1 #README# 2 #README# 1 Makefile 2 Makefile 1 README 2 README $ bash 1369 $> 

मुझे स्टाइल पसंद है जो सूखी बार मोड की अनुमति देता है (बिना | sh )

 cat a.txt | xargs -I % echo "command1; command2; ... " | sh 

पाइपों के साथ भी काम करता है:

 cat a.txt | xargs -I % echo "echo % | cat " | sh