2012-08-22 26 views
59

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

इनपुट में, मैं इस सूची मिलती है:

FILES_IN=file1.doc file2.xls 

और मैं FILES_IN चर से मेरी makefile में इस चर का निर्माण करना चाहते हैं:

FILES_OUT=file1.docx file2.xlsx 

क्या यह संभव है? कैसे ?

यह काफी मुश्किल है क्योंकि मुझे फ़ाइल सूची को पार्स करना है, और एक्सटेंशन को सही करने के लिए इसे बदलने के लिए प्रत्येक एक्सटेंशन (.doc, .xls) का पता लगाना है।

उत्तर

107

व्हाइटस्पेस से अलग फ़ाइल नामों की सूची में एक्सटेंशन को एक सामान्य आवश्यकता है, और इसके लिए अंतर्निहित सुविधाएं हैं। आप सूची में हर नाम के अंत में एक x जोड़ना चाहते हैं:

FILES_OUT = $(FILES_IN:=x) 

सामान्य रूप $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX) है। यह VARIABLE का मान लेता है और प्रत्येक शब्द के अंत में OLD_SUFFIX को प्रतिस्थापित करता है जो इस प्रत्यय के साथ समाप्त होता है NEW_SUFFIX (गैर मिलान वाले शब्द अपरिवर्तित छोड़ दिए जाते हैं)। जीएनयू इस सुविधा को कॉल करता है (जो प्रत्येक मेक कार्यान्वयन में मौजूद है) substitution references

तुम सिर्फ इस सुविधा का उपयोग .xlsx में .docx और .xls में .doc बदलना चाहते हैं, तो आप एक मध्यवर्ती चर का उपयोग करने की आवश्यकता है।

FILES_OUT_1 = $(FILES_IN:.doc=.docx) 
FILES_OUT = $(FILES_OUT_1:.xls=.xlsx) 

आप थोड़ा अधिक सामान्य वाक्यविन्यास $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX) का भी उपयोग कर सकते हैं। यह सुविधा जीएनयू बनाने के लिए अद्वितीय नहीं है, लेकिन यह सादे प्रत्यय-बदलती प्रतिस्थापन के रूप में पोर्टेबल नहीं है।

एक जीएनयू बनाने की सुविधा भी है जो आपको एक ही पंक्ति पर एकाधिक प्रतिस्थापन श्रृंखला प्रदान करने देती है: patsubst function

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN))) 
+2

या बस 'FILES_OUT: = $ (patsubst%,% x, $ (FILES_IN)) 'यदि नियम वास्तव में सामान्य हो सकता है। – tripleee

+0

@Gilles इस सहायक उत्तर के लिए धन्यवाद! – TheFrancisOne

+0

इस ऑपरेटर का नाम क्या है? मैं मैनुअल की जांच करना चाहता हूं, लेकिन उचित नाम नहीं ढूंढ सकता। – rkioji