2017-12-12 103 views
6

मैं बैश कमांड का उपयोग करके कुछ फ़ाइलों का नाम बदलने का प्रयास कर रहा हूं, लेकिन मुझे नहीं पता कि रेगेक्स अभिव्यक्ति में अंकगणितीय अभिव्यक्ति/गणित ऑपरेशन को कैसे जोड़ा जाए।गणित परिचालनों का उपयोग कर फ़ाइलों का नाम बदलें

इनपुट:

a000.png 
a001.png 
... 

ouput:

a010.png 
a011.png 
... 

मैं नाम करने के लिए 10 को जोड़ने के लिए कोशिश कर रहा हूँ।

कुछ बातें मैंने कोशिश की:

rename -n -e 's/a(\d+).png/a$1 + 10.png/' * 
rename -n -e 's/a(\d+).png/a{$1 + 10}.png/' * 
rename -n -e 's/a(\d+).png/a$($1 + 10).png/' * 

वहाँ यह करने के लिए एक आसान तरीका है?

+0

चाल है कि यहाँ 'rename' आदेश perl' सिंटैक्स का उपयोग करता', बजाय 'bash' खोल वाक्य रचना है। मेरे पास विस्तार करने/व्यक्त करने के लिए हाथ पर एक अच्छा, व्यापक स्रोत नहीं है, लेकिन जब मैं करता हूं तो मैं अपने उत्तर से जुड़ा हूं। –

+0

मुझे बाहरी वेबसाइट से लिंक करने में संकोच नहीं है; वहाँ बहुत सारे गाइड हैं (एक Google खोज दूर)। शुरुआत के रूप में, आप 'man perlre' का उपयोग करके एक सरसरी अवलोकन प्राप्त कर सकते हैं। –

उत्तर

5

यह चाल करना चाहिए। यदि आप अग्रणी शून्य नहीं चाहते हैं तो आप sprintf के साथ-साथ "%03d" प्रारूप स्ट्रिंग को हटा सकते हैं। इसके अलावा, अगर फ़ाइलों का नाम बदलना होगा हमेशाa से शुरू होता है, तो आप शाब्दिक चरित्र a के साथ अग्रणी रेगेक्स [a-zA-Z]* भी प्रदान कर सकते हैं। अंत में, हालांकि * फ़ाइल विनिर्देश पर्याप्त हो सकता है, मैं एक अतिरिक्त सुरक्षा सावधानी के रूप में विस्तार पर कार्रवाई करने की अनुशंसा करता हूं (उदा। *.png)।

As always, try it out first using the -n flag to verify the rename is correct.

rename -v 's/([a-zA-Z]*)([0-9]*)/$1.sprintf("%03d",$2+10)/e' * 
+0

पूर्णता के लिए, [यूनिक्स और लिनक्स] पर एक * समान * (डुप्लिकेट नहीं) धागा है (https://unix.stackexchange.com/questions/47006/trying-to-do-arithmetic-in-perl-rename -टोल-डेबियन) जो इस मामले पर अतिरिक्त प्रकाश डाल सकता है। –

+0

यह काम करता है, लेकिन अगर मेरे पास बहुत सारी फाइलें हैं, तो मुझे यह त्रुटि मिलती है: "a001.png का नाम नहीं बदला गया: a011.png पहले से मौजूद है"। मैं सबकुछ "bXXX.png" और फिर 'aXXX.png' पर पुनर्नामित करने में सक्षम था, लेकिन क्या कोई आसान तरीका है? मैंने सोचा कि रिवर्स ऑर्डर में नामों को सॉर्ट करना "ls | sort -r | नाम बदलें ... ", लेकिन ऐसा नहीं हुआ। – klaus

+2

@ क्लोस - मैं सोच रहा था कि आप उस समस्या में भाग लेंगे ... आपका 'ls | sort -r' समाधान आदेश _does_ काम को उलट करने के लिए, लेकिन आपके पास भी है दूर करने के लिए '*' 'rename' आदेश के अंत क्योंकि यह केवल STDIN से फाइलनेम्स पढ़ता @DaveSherohman यह काम करता है, तो कोई नाम के रूप में तर्क –

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