एक BASH शेल में कई कमांडिंग पाइपिंग


0

मैं एक निर्देशिका के माध्यम से पुनरावृत्ति करने की कोशिश कर रहा हूं जिसमें कई अन्य निर्देशिकाएं और फाइलें हैं और फिर सभी .rb फाइलें ढूंढें और उन्हें किसी अन्य निर्देशिका में कॉपी करें।

यह वही है जो मैंने अभी तक किया है, लेकिन यह बहुत सही काम नहीं कर रहा है क्योंकि यह वर्तमान निर्देशिका में निर्दिष्ट निर्देशिका में सब कुछ कॉपी करता है और निर्देशिका से निर्देशिका के लिए .rb (रूबी) फ़ाइलों को प्रिंट नहीं करता है जो पुनरावृत्ति के माध्यम से पुनरावृत्ति करता है।

यह BASH कमांड है जिसका मैं उपयोग कर रहा हूं: ls -R metasploit-framework-master | grep .rb | cp * gems

इस कमांड metasploit-framework-masterमें ls -Rकमांड के साथ पुनरावृत्ति करने के लिए शीर्ष स्तर की निर्देशिका है । इसके अलावा gemsसभी .rb रूबी फ़ाइलों को रखने के लिए निर्देशिका है।

पहला भाग ls -R metasploit-framework-master | grep .rbसभी रूबी स्क्रिप्ट स्रोत फ़ाइलों को खोजने के लिए लगता है, लेकिन अंतिम भाग grep .rb | cp * gemsgrep कमांड के कॉपी कमांड के आउटपुट में पाइप नहीं लगता है।

क्या कोई BASH विशेषज्ञ मेरी मदद कर सकते हैं? `

linux  bash  shell 

"cp * रत्न" स्टड से नहीं पढ़ा जाता है।
असो जूल

इस सवाल का प्रोग्रामिंग से कोई लेना-देना नहीं है।
19jo को 19

@asjo यह शेल प्रोग्रामिंग नहीं है?

मैं एक कमांड से दूसरे प्रोग्रामिंग में पाइपिंग आउटपुट को नहीं कहूंगा, नहीं - मुझे लगता है कि यह सवाल अन्य साइटों पर है।
असजोले

जवाबों:


2

आपको निष्पादन के साथ खोज का उपयोग करना चाहिए, http://en.wikipedia.org/wiki/Find#Execute_an_action देखें । आपके मामले में, यह करना चाहिए:

find metasploit-framework-master -name '*.rb' -exec cp -av {} gems \;

मैंने कोशिश की यह काम करने लगता है! : D मदद के लिए धन्यवाद। मैं आधिकारिक उत्तर देने से पहले अन्य लोगों के विचारों / पटकथा के साथ प्रयोग करने जा रहा हूं। हालांकि यह बहुत बढ़िया है। : !!!

आखिर कर क्या रहा है? या उस मामले के लिए कोष्ठक? 0_o


@JasonC धन्यवाद उपयोगी जानकारी के लिए मुझे ये देखना पड़ेगा। : D

1

यहाँ ड्रॉप करने के लिए सबसे आसान बात है xargsxargsआपको stdinअन्य कमांड में तर्क के रूप में लेने और उनका उपयोग करने देता है। मैं कुछ इस तरह की कोशिश करेंगे:

## This will not work as expected ## 
$ ls -R metasploit-framework-master | grep .rb | xargs -I{} cp {} gems

हालाँकि, यह वास्तव में काम नहीं करेगा जैसा आप चाहते हैं:

  • ls -R आपको पूरा रास्ता देने वाला नहीं है।
  • grep .rbअधिक से अधिक मेल खाता है कि अंत के साथ .rbऔर बच जाना चाहिए।
  • cp {} gems पथ में रिक्त स्थान नहीं संभालेंगे।

इसका उपयोग करने का बेहतर तरीका है find

$ find metasploit-framework-master -name '*.rb' | xargs -I{} cp {} gems/

आप चाहते हैं कि आप पुनरावर्ती गणन करना चाहते हैं। वहाँ से आप उस पाइप को xargsया उससे भी अधिक सकुचाते हुए -execध्वज का उपयोग कर सकते हैं :

$ find metasploit-framework-master -name '*.rb' -exec cp {} gems/ \;

1
ls -Rफ़ाइल पथ आउटपुट नहीं करता है, यह काम नहीं कर रहा है।
जैकब

@ मिचेल धन्यवाद, उपयोगी उत्तर के लिए। इस कमांड में ब्रैकेट्स क्या कर रहा है (पिछले एक) जो कि आरआर (रिकर्सिव कॉपी) का पालन करता है? इसके अलावा, बैकस्लैश आखिर में क्या कर रहा है और क्या अर्ध-उपनिवेश वास्तव में आवश्यक है?

कोष्ठक एक प्लेसहोल्डर हैं जहाँ आप तर्क भरना चाहते हैं और शेष कमांड से अर्द्ध-कॉलोन से बचने के लिए \ _ आवश्यक है।

आपका lsजवाब कई मायनों में त्रुटिपूर्ण है। @ जाकोब द्वारा ऊपर दिए गए बिंदु के अलावा, grep .rbऐसे फाइलनाम को "कार्बन" और "ऑर्बिटल" के रूप में मिलाएगा, क्योंकि " ." बच नहीं जाता है और नियमित अभिव्यक्ति एक " $" के साथ लंगर नहीं डालती है । इसके अलावा, find … | xargs …फ़ाइल नाम के साथ एक समस्या है जिसमें व्हॉट्सएप और / या उद्धरण शामिल हैं; find … -print0 | xargs -0 …इसके बजाय का उपयोग करें । इसके अलावा, आप क्यों बदल cpगए cp -r?
स्कॉट

आम तौर पर बोल, हाँ "xargs" का उपयोग करें। मैं लोगों को क्रियान्वयन के साथ ढूंढता हुआ देखता हूं। मैं अभी भी xargs का उपयोग करना पसंद करता हूं। इसके अलावा, जब आप ऐसा करते हैं, तो कृपया "इको" कमांड का उपयोग पहले करें जब भी संभव हो तो आप देख सकते हैं कि ऐसा होने से पहले वास्तव में क्या होगा। मैंने पाइप और xargs के बजाय लूप्स के लिए उपयोग करना शुरू कर दिया है क्योंकि यह मुझे "इको" का उपयोग करने पर बहुत अधिक नियंत्रण देता है यह देखने के लिए कि क्या होने जा रहा है। एक सरल उदाहरण होगा "फ़ाइल में प्रवेश के लिए [your find statement]; गूंज" cp $ फ़ाइल रत्नों / "; किया" और फिर यदि आप जो देखते हैं वह पसंद करते हैं, तो प्रतिध्वनि निकालें और फिर इसे चलाएं।
बेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.