2012-01-06 8 views
7

में पाश के लिए एक का उपयोग करने के मैं एक पाश का उपयोग करने के लिए कुछ फ़ाइलें खोजने के लिए और उनका नाम बदल करना चाहते हैं:कैसे कर सकता हूँ नुस्खा

for i in `find [email protected] -name *_cu.*`;do mv $i "$(echo $i|sed s/_cu//)" 
    done 

इस खोल में काम करता है। लेकिन मैं इसे मेकफ़ाइल रेसिपी में कैसे कर सकता हूं?

+1

ऑफ विषय: खोज आदेश के भीतर '' * _cu। * '' उद्धृत करना एक अच्छा विचार होगा, जैसा कि आप चाहते हैं कि खोज द्वारा विस्तारित किया गया हो, न कि खोज का आह्वान करने वाला खोल। –

+0

इस कमांड का ट्रिगरिंग आपके लक्ष्य के रूप में इस '$ @' के साथ सही काम नहीं करेगा। – reinierpost

उत्तर

28

दो मुख्य बातें आप को पता है जब मेकअप व्यंजनों में गैर तुच्छ खोल टुकड़े डाल की जरूरत है: (! निश्चित रूप से)

नुस्खा में
  1. आदेश हैं एक समय में एक है, जहां आदेश निष्पादित का अर्थ है "नुस्खा में टैब-प्रीफिक्स्ड लाइन", संभवतः बैकस्लाश के साथ कई मेकफ़ाइल लाइनों पर फैलती है।

    तो आपका खोल टुकड़ा सभी को एक (संभावित रूप से बैकस्लेश) लाइन पर लिखा जाना चाहिए। इसके अलावा यह एक सिंगल लाइन के रूप में खोल को प्रभावी ढंग से प्रस्तुत किया जाता है (बैकस्लेश-न्यूलाइन सादे न्यूलाइन नहीं हैं इसलिए शेल द्वारा कमांड टर्मिनेटर के रूप में उपयोग नहीं किया जाता है), इसलिए इस तरह से वाक्य रचनात्मक रूप से सही होना चाहिए।

  2. दोनों खोल चर और चर बनाने डॉलर चिह्न ([email protected], $i) द्वारा शुरू की गई हैं, ताकि आप उन्हें $$i के रूप में लिख कर मेकअप से अपने खोल चर को छिपाने के लिए की जरूरत है। एक खोल स्क्रिप्ट में (दरअसल, किसी भी डॉलर पर हस्ताक्षर आप $$ के रूप में यह लिख कर खोल के द्वारा देखा जा करने के लिए कर से भाग जाना चाहिए चाहते हैं।)

आम तौर पर आप अलग पंक्ति में अलग आदेशों लिखते थे, लेकिन यहाँ आप प्रभावी रूप से केवल एक पंक्ति प्राप्त करते हैं, इसलिए अलग-अलग शेल कमांड को अर्धविराम के साथ अलग करना चाहिए। आपके उदाहरण के लिए इस सबको एक साथ रखें पैदा करता है:

foo: bar 
    for i in `find [email protected] -name *_cu.*`; do mv $$i "$$(echo $$i|sed s/_cu//)"; done 

या समतुल्य:

foo: bar 
    for i in `find [email protected] -name *_cu.*`; do  \ 
     mv $$i "$$(echo $$i|sed s/_cu//)"; \ 
    done 

सूचना कि बाद, भले ही यह readably कई लाइनों पर बाहर रखी है, रखने के लिए अर्धविराम का एक ही सावधान उपयोग की आवश्यकता है खोल खुश

+0

जिज्ञासा से, आप '$ @' क्यों बरकरार रहते हैं? मेकफ़ाइल में इसका कोई विशेष अर्थ नहीं है? खोल में, यह स्क्रिप्ट तर्कों की सूची में फैलता है ... – fge

+0

@fge: खोल को कमांड को पास करता है जैसे कि 'system()' के माध्यम से, इसलिए कोई शेल स्क्रिप्ट तर्क नहीं है और खोल का '$ @' होगा हमेशा खाली रहो। ओटीओएच बनाने का '$ @' नियम के लक्ष्य (यहां _foo_) को संदर्भित करता है, जिसे मैंने माना था कि क्या इरादा था। –

+1

ठीक है, मुझे यकीन नहीं है, ओपी से टुकड़ा वास्तव में एक शेल स्क्रिप्ट से लगता है – fge

0

मैं इस उपयोगी पाया, छोरों के लिए उपयोग करने के लिए एक से अधिक फ़ाइलों बनाने की कोशिश:

PROGRAMS = foo bar other 

.PHONY all 
all: $(PROGRAMS) 
$(PROGRAMS): 
    gcc -o [email protected] [email protected] 

यह संकलन होगा foo.c, bar.c, other.c Foor बार अन्य निष्पादनयोग्य में

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