जीएनयू में कई एक्सटेंशन वाली सूची में प्रत्येक फ़ाइल के एक्सटेंशन को कैसे बदलें?


84

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

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

FILES_IN=file1.doc file2.xls

और मैं इस बदलाव को FILES_IN चर से अपने बदलाव में बनाना चाहूंगा :

FILES_OUT=file1.docx file2.xlsx

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

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

जवाबों:


141

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

FILES_OUT = $(FILES_IN:=x)

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

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

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

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

एक GNU मेक फ़ीचर भी है जो आपको एक ही पंक्ति में कई विकल्प की श्रृंखला देता है: patsubstफ़ंक्शन

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

3
या सिर्फ FILES_OUT := $(patsubst %,%x,$(FILES_IN))अगर नियम को वास्तव में सामान्य बनाया जा सकता है।
ट्रिपलए

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

1
@rkioji क्या ऑपरेटर? मैं ग्नू मेक मैनुअल के लिए एक लिंक देता हूं $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX), आप और क्या बता रहे हैं?
गिल्स एसओ- बुराई को रोकें '

@ गिल्स ओह, हाँ, लिंक नहीं देखा। मैंने "प्रतिस्थापन" का उल्लेख किया। धन्यवाद!
आरएफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.