2013-02-01 7 views
8

में कमांड के बीच में xargs के साथ सभी तर्क कैसे पारित कर सकता हूं मैं सभी फ़ाइलों को लिनक्स पर एक ही तर्क के रूप में पास करना चाहता हूं लेकिन मैं ऐसा करने में सक्षम नहीं हूं।मैं लिनक्स

यह

ls | sort -n | xargs -i pdftk {} cat output combinewd2.pdf 

यह आदेश प्रति एक भी तर्क गुजरता काम कर रहा है, लेकिन मैं एक आदेश में सभी चाहते हैं।

उत्तर

13

यह

pdftk $(ls | sort -n) cat output combinewd2.pdf 

या

pdftk `ls | sort -n` cat output combinewd2.pdf 

रूप बैकटिक का उपयोग कर टिप्पणियाँ इस रिक्त स्थान युक्त फ़ाइल नाम पर काम नहीं करेगा में बताया करने के लिए एक तरीका है। उस मामले में आप eval

eval pdftk $(while IFS= read -r file; do 
    echo \"$file\" 
done < <(ls | sort -n)) cat output combinewd2.pdf 

इस्तेमाल कर सकते हैं मान लीजिए वहाँ दो "0 foo" और "1 बार" नाम फ़ाइलें हैं तो eval का परिणाम वांछित आदेश होगा, दोहरे उद्धरण में फ़ाइल नाम के साथ:

pdftk " 0 foo " " 1 bar " cat output combinewd2.pdf 

यदि फ़ाइल नामों में न्यूलाइन हो सकती है, तो find कमांड का उपयोग करें, @Andeydwiddle द्वारा @ andrewdotn के उत्तर की टिप्पणियों में चर्चा देखें।

eval pdftk $(while IFS= read -r -d '' file; do 
    echo \"$file\" 
done < <(find . -maxdepth 1 -type f -print0 | \ 
    sed 's/"/\\"/g'| sort -zn)) cat output combinewd2.pdf 
+2

एक बहुत ही 'bash' केंद्रित जवाब है, लेकिन फिर भी शांत। हालांकि, यह 'csh/tcsh' में काम नहीं करेगा। (खोल विकल्प> '/ dev/null' के बारे में सभी टिप्पणियां) – radical7

+0

महत्वपूर्ण रूप से, ** यह रिक्त स्थान वाले फ़ाइल नामों पर काम नहीं करेगा **। शब्द अलग तर्कों में विभाजित हो जाएंगे। – joeytwiddle

+0

@joeytwiddle आप सही हैं, मैं eval – amdn

8

यह बदसूरत है, लेकिन आप sh -c चलाने के लिए और इतने की तरह, "${@}" रूप xargs द्वारा पारित तर्कों की सूची तक पहुँच सकते हैं: निम्नलिखित समाधान भी sed आदेश का उपयोग कर दोहरे उद्धरण चिह्नों से बचने के लिए दोहरे उद्धरण चिह्नों के साथ फ़ाइल नाम संभालता है:

ls | sort -n | xargs -d'\n' sh -c 'pdftk "${@}" cat output combinewd2.pdf' "${0}" 

अतिरिक्त "${0}" अंत में वहाँ है, क्योंकि, sh man page says

के रूप में

-cस्ट्रिंग

तो -c विकल्प मौजूद है, तो आज्ञाओं स्ट्रिंग से पढ़ा जाता है। यदि स्ट्रिंग के बाद तर्क हैं, तो उन्हें $ से शुरू होने वाले स्थितित्मक पैरामीटर को असाइन किया गया है।

इस परीक्षण के लिए, का पहला यह है कि ज्यादातर अन्य समाधान गंदगी होगा जटिल नाम के साथ कुछ फ़ाइलों को बना सकते हैं:

$ seq 1 100 | xargs -I{} touch '{} with "spaces"' 
$ ls 
1 with "spaces" 31 with "spaces" 54 with "spaces" 77 with "spaces" 
10 with "spaces" 32 with "spaces" 55 with "spaces" 78 with "spaces" 
100 with "spaces" 33 with "spaces" 56 with "spaces" 79 with "spaces" 
11 with "spaces" 34 with "spaces" 57 with "spaces" 8 with "spaces" 
12 with "spaces" 35 with "spaces" 58 with "spaces" 80 with "spaces" 
13 with "spaces" 36 with "spaces" 59 with "spaces" 81 with "spaces" 
14 with "spaces" 37 with "spaces" 6 with "spaces" 82 with "spaces" 
15 with "spaces" 38 with "spaces" 60 with "spaces" 83 with "spaces" 
16 with "spaces" 39 with "spaces" 61 with "spaces" 84 with "spaces" 
17 with "spaces" 4 with "spaces" 62 with "spaces" 85 with "spaces" 
18 with "spaces" 40 with "spaces" 63 with "spaces" 86 with "spaces" 
19 with "spaces" 41 with "spaces" 64 with "spaces" 87 with "spaces" 
2 with "spaces" 42 with "spaces" 65 with "spaces" 88 with "spaces" 
20 with "spaces" 43 with "spaces" 66 with "spaces" 89 with "spaces" 
21 with "spaces" 44 with "spaces" 67 with "spaces" 9 with "spaces" 
22 with "spaces" 45 with "spaces" 68 with "spaces" 90 with "spaces" 
23 with "spaces" 46 with "spaces" 69 with "spaces" 91 with "spaces" 
24 with "spaces" 47 with "spaces" 7 with "spaces" 92 with "spaces" 
25 with "spaces" 48 with "spaces" 70 with "spaces" 93 with "spaces" 
26 with "spaces" 49 with "spaces" 71 with "spaces" 94 with "spaces" 
27 with "spaces" 5 with "spaces" 72 with "spaces" 95 with "spaces" 
28 with "spaces" 50 with "spaces" 73 with "spaces" 96 with "spaces" 
29 with "spaces" 51 with "spaces" 74 with "spaces" 97 with "spaces" 
3 with "spaces" 52 with "spaces" 75 with "spaces" 98 with "spaces" 
30 with "spaces" 53 with "spaces" 76 with "spaces" 99 with "spaces" 
$ ls | sort -n | xargs -d'\n' sh -c 'set -x; pdftk "${@}" cat output combinewd2.pdf' "${0}" 
+ pdftk '1 with "spaces"' '2 with "spaces"' '3 with "spaces"' '4 with "spaces"' '5 with "spaces"' '6 with "spaces"' '7 with "spaces"' '8 with "spaces"' '9 with "spaces"' '10 with "spaces"' '11 with "spaces"' '12 with "spaces"' '13 with "spaces"' '14 with "spaces"' '15 with "spaces"' '16 with "spaces"' '17 with "spaces"' '18 with "spaces"' '19 with "spaces"' '20 with "spaces"' '21 with "spaces"' '22 with "spaces"' '23 with "spaces"' '24 with "spaces"' '25 with "spaces"' '26 with "spaces"' '27 with "spaces"' '28 with "spaces"' '29 with "spaces"' '30 with "spaces"' '31 with "spaces"' '32 with "spaces"' '33 with "spaces"' '34 with "spaces"' '35 with "spaces"' '36 with "spaces"' '37 with "spaces"' '38 with "spaces"' '39 with "spaces"' '40 with "spaces"' '41 with "spaces"' '42 with "spaces"' '43 with "spaces"' '44 with "spaces"' '45 with "spaces"' '46 with "spaces"' '47 with "spaces"' '48 with "spaces"' '49 with "spaces"' '50 with "spaces"' '51 with "spaces"' '52 with "spaces"' '53 with "spaces"' '54 with "spaces"' '55 with "spaces"' '56 with "spaces"' '57 with "spaces"' '58 with "spaces"' '59 with "spaces"' '60 with "spaces"' '61 with "spaces"' '62 with "spaces"' '63 with "spaces"' '64 with "spaces"' '65 with "spaces"' '66 with "spaces"' '67 with "spaces"' '68 with "spaces"' '69 with "spaces"' '70 with "spaces"' '71 with "spaces"' '72 with "spaces"' '73 with "spaces"' '74 with "spaces"' '75 with "spaces"' '76 with "spaces"' '77 with "spaces"' '78 with "spaces"' '79 with "spaces"' '80 with "spaces"' '81 with "spaces"' '82 with "spaces"' '83 with "spaces"' '84 with "spaces"' '85 with "spaces"' '86 with "spaces"' '87 with "spaces"' '88 with "spaces"' '89 with "spaces"' '90 with "spaces"' '91 with "spaces"' '92 with "spaces"' '93 with "spaces"' '94 with "spaces"' '95 with "spaces"' '96 with "spaces"' '97 with "spaces"' '98 with "spaces"' '99 with "spaces"' '100 with "spaces"' cat output combinewd2.pdf 

सभी तर्कों को सही ढंग से उद्धृत कर रहे हैं। ध्यान दें कि अगर किसी फ़ाइल नाम में न्यूलाइन हो, तो यह असफल हो जाएगा, और ls -v मूल रूप से ls | sort -n है।

+0

यह रिक्त स्थान वाले फ़ाइल नामों पर काम करता है, लेकिन न्यूलाइन वाले फ़ाइल नामों पर नहीं। यद्यपि वे बहुत आम नहीं हैं, उन्हें सही ढंग से संभाला जा सकता है: 'ढूंढें। -टाइप f -maxdepth 1 -print0 | sort -zn | xargs -0 sh -c ... ' – joeytwiddle

+0

हालांकि अगर हम 'ढूंढ' का उपयोग कर रहे हैं तो हमें 'xargs' की आवश्यकता नहीं है! हम 'Bash ... -exec [command] {} + 'का उपयोग कर सकते हैं जैसा कि [BashFAQ/020] (http://mywiki.wooledge.org/BashFAQ/020) में अनुशंसित है। – joeytwiddle

+0

@joeytwiddle Yup, 'ls' के बजाय 'find' का उपयोग करें यदि फ़ाइल नामों में न्यूलाइन हो सकती है। – andrewdotn

2

इस रिक्त स्थान, नई-पंक्तियों, अक्षर लोप और उद्धरण चिह्न (जो सभी यूनिक्स फ़ाइल सिस्टम पर संभव हो रहे हैं) से युक्त फ़ाइल नाम पर काम करना चाहिए:

find . -maxdepth 1 -type f -print0 | 
    sort -zn | 
    xargs -0 sh -c 'pdftk "[email protected]" cat output combinewd2.pdf' "$0" 

कि overkill स्वीकार किए जाते हैं जवाब की तुलना में किया जा सकता है, यदि आप क्या आप जानते हैं सरल फ़ाइल नामों के साथ काम कर रहे हैं।

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

यह मूल रूप से andrewdotn का उत्तर है जो एक नई लाइन के बजाय शून्य-बाइट के साथ इनपुट फ़ाइलों को समाप्त करता है, इसलिए फाइलनामों को संरक्षित करता है जिसमें एक या अधिक न्यूलाइन वर्ण होते हैं।

संबंधित विकल्प -print0, -z और -0 प्रत्येक प्रोग्राम को इनपुट/आउटपुट शून्य-बाइट द्वारा सीमित किया जाना चाहिए। तीन अलग-अलग कार्यक्रम, तीन अलग-अलग तर्क!

0

समस्या यह है कि xargs -i और {} के साथ कमांड के बीच में व्यक्तिगत तर्क डाल सकता है, यह कई तर्कों के लिए ऐसा करने से इंकार कर देता है। ऐसा लगता है कि यह एक निरीक्षण है जो हमें बहुत परेशानी का कारण बनता है!

उपरोक्त समाधानों के अलावा, एक अन्य विकल्प केवल उन तर्कों को जोड़ना है जिन्हें आप फाइलों की सूची के अंत में फाइलों के बाद आना चाहते हैं।

(
    ls | sort -n 
    echo cat 
    echo output 
    echo combinewd2.pdf 
) | xargs -d'\n' pdftk 

यह दृष्टिकोण नई-पंक्तियों युक्त फ़ाइल नाम पर काम नहीं करता। उस दुर्लभ मामले के लिए आपको शून्य बाइट से xargs तक समाप्त लाइनों को पारित करना चाहिए, जैसा कि मेरे दूसरे उत्तर में दिया गया है।

8

उपयोग -I विकल्प:

echo prefix | xargs -I % echo % post 

आउटपुट:

prefix post 
+1

हालांकि, यह वांछित के रूप में काम नहीं करता है (यह तीन तर्कों के साथ तीन बार आदेश देता है) यदि आप इनपुट के रूप में 'echo' के बजाय 'ls' का उपयोग करें, जो ओपी करने की कोशिश कर रहा है ... – DNA