2009-12-13 13 views
20

मैं इस पर बहुत उलझन में हूं। कुछ स्पष्टीकरण की आवश्यकता है।यूनिक्स कमांड xargs को समझना

उदाहरण 1:

pgrep string | xargs ps 

उदाहरण 2:

"स्ट्रिंग" है जिसके लिए खोज:

find . | xargs grep whatever 

उदाहरण 1 से, मैं इसे इकट्ठा इस तरह से है चल रही प्रक्रिया के नाम का हिस्सा और सभी मैचों की प्रक्रिया-आईडी को 'xargs ps' पर वापस लाएं -> जो अभी संलग्न करता है मैचों (जो प्रक्रिया-आईडी खुद को कर रहे हैं) के लिए ps रूप में एक ही उत्पादन प्राप्त करने के लिए:

ps <processid> 

कोई व्याख्या कर सकते हैं क्या वास्तव में xargs इस मामले में करता है?

उदाहरण 2 से, मैं इकट्ठा यह इस तरह से है:

यह वर्तमान कार्यशील निर्देशिका से कुछ "स्ट्रिंग" के लिए खोज करने के लिए पुनरावर्ती है। यहां, 'xargs' वास्तव में कैसे काम करता है?

मेरा मानना ​​था कि 'xargs' बार-बार मानक इनपुट से डेटा को xargs को दिए गए 'तर्क' में जोड़ता है (जो आमतौर पर एक यूनिक्स कमांड होता है)।

xargs से() आदमी पेज:

xargs मानक इनपुट से आइटम, कारतूस द्वारा सीमांकित या नई-पंक्तियों (जो डबल या एकल उद्धरण या एक बैकस्लैश के साथ संरक्षित किया जा सकता) पढ़ता है, और कार्यान्वित मानक इनपुट से पढ़ी गई वस्तुओं के बाद प्रारंभिक-तर्कों के साथ किसी भी प्रारंभिक-तर्कों के साथ एक या अधिक बार आदेश (डिफ़ॉल्ट/bin/echo) है। मानक इनपुट पर खाली लाइन अनदेखा कर रहे हैं।

+0

xargs "कमांड subtitution" (कम से कम बैश के साथ) की तरह काम करता का उपयोग कर ARG_MAX के वर्तमान मूल्य प्राप्त कर सकते हैं। यह टोकन तर्क (क्षैतिज) की एक पंक्ति सूची में मल्टीलाइन परिणाम (लंबवत) को बदल देता है। (ध्यान दें कि आप xargs के माध्यम से इसे पार करने से पहले परिणामों को थोड़ा सा फ़िल्टर कर सकते हैं (पूर्व में sed का उपयोग कर)। प्लस xargs «_too बहुत arguments_» त्रुटि को संभालता है जो लिनक्स कर्नेल 2.6.23 से पहले ठीक हो सकता है (देखें [विकिपीडिया] (https://en.wikipedia.org/wiki/Xargs))। यहाँ है [एक और उपयोगी धागा] (http://unix.stackexchange.com/questions/24954/when-is-xargs-needed) – Stphane

उत्तर

37

सामान्य xargs में इस

prog की तरह इस्तेमाल किया जाता है | xargs उपयोगिता

जहां prog उत्पादन एक या अधिक न्यू लाइन/अंतरिक्ष अलग परिणाम की उम्मीद है। चाल यह है कि xargs नहीं है! nessarly कॉल उपयोगिता प्रत्येक परिणाम के लिए एक बार, इसके बजाय परिणाम सूची को उपन्यासियों में विभाजित करता है और प्रत्येक उपन्यासकार के लिए उपयोगिता पर कॉल करता है। यदि आप प्रत्येक परिणाम के लिए उपयोगिता पर कॉल करने के लिए xargs को मजबूर करना चाहते हैं तो आपको xargs -L1 के साथ इसे आमंत्रित करने की आवश्यकता होगी।

ध्यान दें कि xargs आप वादा करता है कि sublist उपयोगिता के लिए भेजा से कम ARG_MAX (यह है कि इसमें कितना समय त्रुटियों के उन खतरनाक तर्क सूची से बचा जाता है) है।आप getconf ARG_MAX

+1

ठीक है, यह कुछ ऐसा है जो मैं संबंधित हो सकता था, लेकिन अब यह नरक बन गया है और अब बहुत भ्रमित है। मैं बुनियादी कारण है कि xargs वहाँ है, लेकिन यह घुमावदार हो जाता है जब मैं इसे (अलग अलग तरीकों से) एक से अधिक उद्देश्य के लिए इस्तेमाल किया जा रहा देख .. – halluc1nati0n

+7

इस आदेश पर विचार करें "लगता है/आदि प्रकार घ गहराई से 1 | xargs गूंज" जो/etc फ़ोल्डर में सभी निर्देशिकाओं को मुद्रित करता है (लेकिन उनकी उप निर्देशिका नहीं)। जैसे-जैसे गूंज कई तर्क लेता है परिणाम परिणाम एक लंबी रेखा "/ etc/dir1/etc/dir2 ..." है। यदि आप इसके बजाय "find/etc -type d -depth 1 | xargs -L1 echo" कॉल करते हैं, तो प्रत्येक परिणाम के लिए इको को एक बार बुलाया जाता है, जिसके परिणामस्वरूप/प्रत्येक निर्देशिका को/रेखा से मुद्रित किया जाता है। –

+0

मैं उपयोगिता के लिए आदेश या विकल्प कैसे पास करूं? कहें, मैं xglifyjs चलाने और xargs में आने वाले इनपुट के लिए फ़ोल्डर निर्दिष्ट और आउटपुट करना चाहता हूँ? http://stackoverflow.com/questions/43149786/how-to-process-files-in-nested-directories – Costa

2

xargs सामान्य रूप से एक साथ समूह तर्क लिए किया जाता है, ताकि आप न एक "बहुत सारे तर्क" त्रुटि तब होती है जो जब आप एक आदेश

6
$ echo 'line1 
> line2 
> line3 
> ... 
> lineN ' | xargs cmd1 -a -b 

में परिणाम होगा करने के लिए तर्क की एक बड़ी संख्या को पारित मिलती है: अगर लाइन संख्या बहुत बड़ी हो जाता है

$ cmd1 -a -b line1 line2 line3 ... lineN 

xargscmd1 के कई सज़ाएँ में cmd1 ... टूट जाएगा।

xargsstdin लाइनों को स्थितिगत तर्क के रूप में पारित करने से संबंधित कई अन्य कार्यों के लिए उपयोग किया जा सकता है। समांतर में कमांड के कई उदाहरण चलाने के लिए xargs(1) में राजधानी -P विकल्प पर नज़र डालें।

1
#!/bin/sh 
#script to echo out the arguments 1 at a time! 
for a in $* 
do 
    echo $a 
done 

आदेश

$sh myscript 1 2 3 4 5 

निकलेगा

1 
2 
3 
4 
5 

लेकिन

$sh myscript 1 2 3 4 5 6 7 8 9 10 11 

मानकों की अधिकतम संख्या के बाद से काम नहीं करेगा पार हो गई है (आईएम वास्तव में यकीन नहीं क्या अधिकतम है, लेकिन इसके लिए 10 कहें इस उदाहरण!)

इस के आसपास पाने के लिए हम इस्तेमाल कर सकते हैं

#!/bin/sh 
#script to echo out the arguments 1 at a time! 
for a in $* 
do 
    echo $a | xargs echo 
done 

हम तो इस

$sh myscript "1 2 3 4 5" "6 7 8 9 10 11" 

की तरह इसे चलाने और के बाद से वहाँ सिर्फ 2 मापदंड हैं सही परिणाम मिल सकता है

+2

मैं अधिकतम पता नहीं क्या है, लेकिन इसकी निश्चित रूप से नहीं 10 और तुम उपयोग कर सकते हैं $ * के बजाय $ @। यह कैसे xargs – ghostdog74

9

एक्सर्ज का उपयोग करने के लिए एक निर्देशिका में प्रत्येक फ़ाइल के लिए क्रमबद्ध चेकसम प्राप्त करने का प्रयास करने के लिए xargs का एक अच्छा उदाहरण है।

find . | cksum | sort 

केवल एक चेकसम लौटाता है, और यह स्पष्ट नहीं है कि यह चेकसम है। हम क्या नहीं चाहते हैं। पाइप stdout cksum के लिए stdin में खोजने से भेजता है। वास्तव में क्या कक्सम चाहता है कमांड लाइन तर्कों की एक सूची है, उदा।

cksum file001.blah file002.blah file003.blah 

वांछित चेकसम के साथ तीन पंक्तियों, एक प्रति फ़ाइल की रिपोर्ट करेगा। Xargs जादू चाल करता है - पिछले कार्यक्रम के stdout परिवर्तित करने के लिए एक अस्थायी और छिपे हुए कमांड लाइन को अगले फ़ीड करने के लिए। कमांड लाइन जो काम करती है वह है:

find . | xargs cksum | sort 

xargs और cksum के बीच कोई पाइप नोट करें।

+1

उपयोग करने के लिए की एक बहुत अच्छा उदाहरण btw, यह दो या अधिक निर्देशिका में डुप्लिकेट फ़ाइलें खोजने के लिए मेरी नुस्खा में मुख्य घटक है, भले ही उनके नाम अलग हैं नहीं है। – DarenW

+0

अंतर्दृष्टि के लिए धन्यवाद और xargs में verbose जोड़ने कार्रवाई में आदेश देता है। ढूंढो | xargs --verbose cksum | क्रमबद्ध करें – kumar

संबंधित मुद्दे