BASH

2009-11-04 12 views
5

में कमांड लाइन बहस के रूप में फ़ाइल सामग्री का उपयोग करना मैं कमांड लाइन तर्क के रूप में फ़ाइल की सामग्री का उपयोग कैसे करना चाहता हूं, लेकिन सिंटैक्स के साथ संघर्ष कर रहा हूं।BASH

# cat > arglist 
src/file1 dst/file1 
src/file2 dst/file2 
src/file3 dst/file3 

मैं कैसे बहस में कहने के लिए के रूप में arglist फ़ाइल में प्रत्येक पंक्ति की सामग्री का उपयोग कर सकते हैं, एक cp आदेश:

मैं निम्नलिखित मिल गया है कहो?

उत्तर

7

xargs के लिए '-n' विकल्प निर्दिष्ट करता है कि कितने तर्क आदेश के अनुसार का उपयोग करें:

$ xargs -n2 < arglist echo cp 

cp src/file1 dst/file1 
cp src/file2 dst/file2 
cp src/file3 dst/file3 
+0

'<' कैसे काम करता है? – Michelle

1

आप पाइप का उपयोग कर सकते (|):

cat file | echo 

या इनपुट पुनर्निर्देशन (<)

cat < file 

या xargs

xargs sh -c 'emacs "[email protected]" < /dev/tty' emacs 

तो फिर तुम तर्क पाने के लिए awk का उपयोग कर सकते हैं:

cat file | awk '{ print $1; }' 

आशा इस मदद करता है ..

+0

कोई जरूरत नहीं करने के लिए सेट अजीब टुकड़े के लिए बिल्ली – ghostdog74

+0

ये सभी _something_ करते हैं लेकिन उनमें से सभी लक्ष्य से बाहर हैं। – Jamie

+0

'echo'' stdin' से नहीं पढ़ा जाता है। 'बिल्ली' के अलावा 'echo' की आवश्यकता नहीं है। साथ ही, आपको 'cat' में रीडायरेक्ट करने की आवश्यकता नहीं है - यह काम करता है: 'बिल्ली फ़ाइल'। –

3

read का उपयोग करना (यह मान है कि arglist में फ़ाइल नाम में कोई भी स्पेस बच गए हैं):

while read src dst; do cp "$src" "$dst"; done < argslist 

फ़ाइल में तर्क सही क्रम में कर रहे हैं और रिक्त स्थान के साथ फ़ाइल नाम उद्धृत कर रहे हैं, तो यह भी काम करेगा:

while read args; do cp $args; done < argslist 
+0

+1 मेरे समाधान से काफी बेहतर: -D – NawaMan

+0

थोड़ी देर के पढ़ने के दौरान लूप "आखिरी पंक्ति को पढ़ने से चूक जाएगा" अगर कोई आखिरी नई लाइन नहीं है। – ghostdog74

0

अगर उद्देश्य thelist में उन फ़ाइलों को सी.पी. करने के लिए बस है

$ awk '{cmd="cp "$0;system(cmd)}' file 
+0

हथौड़ों? नाखून? –

+0

जब आप इसे खोल के साथ करते हैं तो कोई अलग नहीं होता है। खोल सिस्टम कमांड भी कॉल कर रहा है। – ghostdog74

0

उपयोग IFS (आंतरिक फील्ड सेपरेटर) के साथ for पाश new line

OldIFS=$IFS # Save IFS 
$IFS=$'\n' # Set IFS to new line 
for EachLine in `cat arglist"`; do 
Command="cp $Each" 
`$Command`; 
done 
IFS=$OldIFS 
+0

आदेश और उसके तर्क को एक चर में रखना आवश्यक नहीं है। वैसे भी, आपको इसे काम करने के लिए '$ कमांड' या '\' $ कमांड \ '' करना होगा। –

+0

धन्यवाद, मुझे याद आती है: डी – NawaMan