2012-12-18 48 views
89

उदाहरण के लिए, अभी मैं फ़ाइलों जिसका यूनिक्स पथ मैं एक फाइल करने के लिए लिखा था की एक जोड़ी को बदलने के लिए निम्नलिखित का उपयोग कर रहा हूँ?

उत्तर

68

तो आपकी फ़ाइल बहुत बड़ी नहीं है और सभी फ़ाइलें हैं अच्छी तरह से नामित (रिक्त स्थान या उद्धरण की तरह अन्य विशेष वर्ण के बिना), तो आप बस कर सकते थे:

chmod 755 $(<file.txt) 

आप विशेष वर्ण है, तो और/या file.txt में कई लाइनें।

xargs -0 chmod 755 < <(tr \\n \\0 <file.txt) 

अपने आदेश प्रविष्टि द्वारा 1 समय वास्तव में चलाने के लिए की जरूरत है:

xargs -0 -n 1 chmod 755 < <(tr \\n \\0 <file.txt) 

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

कुछ विशेष मामले के लिए, आप भी फ़ाइल तर्क का स्थान आदेश generateds में xargs द्वारा निर्धारित कर सकते हैं:

xargs -0 -I '{}' -n 1 myWrapper -arg1 -file='{}' wrapCmd < <(tr \\n \\0 <file.txt) 
+3

के लिए '-l' का उपयोग करें क्योंकि' xargs' प्रारंभिक निर्माण था इस तरह की जरूरतों का उत्तर देने के लिए, कुछ सुविधाओं, जैसे कि मौजूदा पर्यावरण में यथासंभव लंबे समय तक बिल्डिंग कमांड * इस मामले में जितनी कम हो सके 'चम्मोड' का आह्वान करने के लिए, * फोर्क्स को कम करना * प्रभाव सुनिश्चित करना। 'जबकि; do..done <$ file' implie 1 फ़ाइल के लिए 1 कांटा चल रहा है। 'xargs' हजारों फ़ाइलों के लिए 1 कांटा चला सकता है ... एक विश्वसनीय तरीके से। –

+1

तीसरा आदेश मेकफ़ाइल में क्यों काम नहीं करता है? मुझे "अप्रत्याशित टोकन '<' 'के पास वाक्यविन्यास त्रुटि मिल रही है, लेकिन कमांड लाइन कार्यों से सीधे निष्पादन। –

+2

यह मेकफ़ाइल विशिष्ट वाक्यविन्यास से जुड़ा हुआ प्रतीत होता है। आप कमांड लाइन को रिवर्स करने का प्रयास कर सकते हैं: 'cat file.txt | tr \\ n \\ 0 | xargs -0 -n1 chmod 755' –

88

हां।

while read in; do chmod 755 "$in"; done < file.txt 

इस तरह आप cat प्रक्रिया से बच सकते हैं।

cat इस तरह के उद्देश्य के लिए लगभग हमेशा खराब होता है। अगर आप (एक निर्देशिका में सभी .txt फ़ाइलें उदाहरण के लिए) एक अच्छा चयनकर्ता है आप और अधिक के बारे में Useless Use of Cat.

+0

से बचें * एक * 'बिल्ली 'से बचें एक अच्छा विचार है, लेकिन इस मामले में ** ** ** संकेत दिया गया आदेश' xargs' –

+0

वह लिंक प्रासंगिक प्रतीत नहीं होता है, शायद वेब पेज की सामग्री बदल गई है? बाकी का जवाब भयानक है हालांकि – starbeamrainbowlabs

+0

@starbeamrainbowlabs हां। ऐसा लगता है कि पेज ले जाया गया है। मैंने फिर से लिंक किया है और अभी ठीक होना चाहिए। धन्यवाद :) –

9

पढ़ सकते हैं तुम कर सकते हो:

for i in *.txt; do chmod 755 "$i"; done 

bash for loop

या का एक संस्करण आपका:

while read line; do chmod 755 "$line"; done <file.txt 
+0

काम नहीं करता है कि यदि रेखा में रिक्त स्थान हैं, तो इनपुट रिक्त स्थान से विभाजित होता है, रेखा से नहीं। –

9

यदि आपको पता है कि आपके पास इनपुट में कोई सफेद जगह नहीं है:

xargs chmod 755 < file.txt 

अगर वहाँ रास्तों में खाली स्थान के हो सकता है, और यदि आप जीएनयू xargs है:

tr '\n' '\0' < file.txt | xargs -0 chmod 755 
+0

मुझे xargs के बारे में पता है, लेकिन (दुख की बात है) यह बैश निर्मित सुविधाओं की तुलना में एक विश्वसनीय समाधान से कम लगता है जैसे कि पढ़ना और पढ़ना। इसके अलावा, मेरे पास जीएनयू xargs नहीं है, लेकिन मैं ओएस एक्स और xargs का उपयोग कर रहा हूँ यहां एक -0 विकल्प भी है। जवाब के लिए धन्यवाद। – hawk

+1

@ हॉक संख्या: 'xargs' मजबूत है। यह टूल बहुत पुराना है और उसका कोड दृढ़ता से * पुनरीक्षित * है। उनका लक्ष्य शैल सीमाओं (64kchar/line या कुछ ऐसा) के संबंध में लाइनों का निर्माण शुरू करना था। अब यह टूल बहुत बड़ी फाइलों के साथ काम कर सकता है और फाइनल कमांड पर फोर्क की संख्या को कम कर सकता है। [मेरा जवाब] देखें (http://stackoverflow.com/a/13941223/1765658) और/या 'मैन xargs'। –

+0

@hawk किस तरह से एक विश्वसनीय समाधान का कम? यदि यह लिनक्स, मैक/बीएसडी और विंडोज (हाँ, एमएसवाईएसजीआईटी के बंडल जीएनयू xargs) में काम करता है, तो यह जितना विश्वसनीय हो उतना विश्वसनीय है। –

2

मैं देख रहा हूँ आप बैश में चिह्नित है, लेकिन पर्ल भी यह करने के लिए एक अच्छा तरीका होगा:

perl -p -e '`chmod 755 $_`' file.txt 

आप यह सुनिश्चित करने के लिए एक रेगेक्स भी लागू कर सकते हैं कि आपको सही फाइलें मिल रही हैं, उदाहरण के लिए केवल प्रक्रिया .txt फ़ाइलें करने के लिए:

perl -p -e 'if(/\.txt$/) `chmod 755 $_`' file.txt 

"पूर्वावलोकन" क्या हो रहा है, बस दोहरे उद्धरण चिह्नों के साथ बैकटिक की जगह और print पहले जोड़ें करने के लिए:

perl -p -e 'if(/\.txt$/) print "chmod 755 $_"' file.txt 
+2

बैकटिक्स का उपयोग क्यों करें? पर्ल में एक ['chmod' फ़ंक्शन] है (http://perldoc.perl.org/functions/chmod.html) –

+0

मुझे इसका एहसास नहीं हुआ। इसे इंगित करने के लिए धन्यवाद :) –

+1

आप 'perl -lpe' chmod 0755, $ _ 'file.txt' चाहते हैं - "ऑटो-चॉम्प" सुविधा –

7

आप उपयोग कर सकते हैं आप प्रत्येक पंक्ति के लिए समानांतर में अपने आदेश को चलाना चाहते हैं GNU Parallel

parallel -a <your file> <program> 

आपकी फ़ाइल की प्रत्येक पंक्ति को तर्क के रूप में प्रोग्राम में पास कर दिया जाएगा। डिफ़ॉल्ट रूप से parallel आपके CPU की गणना के रूप में कई धागे चलाता है। लेकिन आप इसे -j