फ़ोल्डर में बैच का नाम बदलें फ़ाइलें


10

मैं फ़ोल्डर में फ़ाइल नाम से कुछ पाठ कैसे निकाल सकता हूं?

मैं वर्तमान में प्रयास कर रहा हूं:

rename s/"NEWER_(.*?)"//g *

लेकिन इसका कुछ भी नाम नहीं बदला जा रहा है

मेरे पास एक पैरेंट फोल्डर है, सब-फोल्डर का एक गुच्छा, फाइलों के भीतर, कि वनड्राइव ने सोचा कि एक "(NEWER_timestamp)" को जोड़ने के लिए एक शानदार विचार होगा, और मैं इसे दूर करना चाहूंगा।

उदाहरण फ़ाइल नाम:

getyou.ico (NEWER_1417529079.87)
o7pm.ico (NEWER_1417529184.89)
o7th.ico (NEWER_1417529135.81)

2
क्या आप एक उदाहरण फ़ाइल नाम पोस्ट कर सकते हैं?
मूरू

ज़रूर। कुछ के साथ अद्यतन सवाल
केविन

जवाबों:


8

निम्नलिखित का प्रयास करें:

find /path/to/parrent-dir -type f -exec rename -n 's:[^/]*(.*) .*$:$1:' {} +

./o7th.ico (NEWER_1417529135.81)                                 renamed as /o7th.ico
./sub-dir (NEWER_1417529135.81)/getyou.ico (NEWER_1417529079.87) renamed as /sub-dir (NEWER_1417529135.81)/getyou.ico
./sub-dir (NEWER_1417529135.81)/o7pm.ico (NEWER_1417529184.89)   renamed as /sub-dir (NEWER_1417529135.81)/o7pm.ico
./getyou.ico (NEWER_1417529079.87)                               renamed as /getyou.ico
./o7pm.ico (NEWER_1417529184.89)                                 renamed as /o7pm.ico
  • सभी [^/]*(.*) .*$केवल उस पथ के अंतिम भाग से मेल खाते हैं जिसमें a नहीं है /। तथा
  • ऊपर रेगेक्स में, (.*)अंतिम /और एक स्थान से पहले सब कुछ मिलान करने का एक समूह है । इसका बैक-रेफरेंस होगा $1
  • .*$$अंतरिक्ष के बाद फ़ाइलों के नाम के अंत के लिए सब कुछ मेल खाता है।
  • अंत में नाम बदलने के हिस्से में s/.../REPLACEMENT/, हमने केवल मिलान किए गए समूह को रखा जो कि अंतिम \और एक स्थान के बीच (.*)है जिसे मैचों के समूह के रूप में जाना जाता है।

2

आपको रेगेक्स के बाहर उद्धरणों का उपयोग करने पर विचार करना चाहिए (भीतर, वे सचमुच उद्धरण के रूप में लिए जाते हैं), और बच (। प्रयत्न;

rename -n 's/ \(NEWER_\d{10}.\d{2}\)$//' *NEWER*

अभिव्यक्ति की सटीकता आवश्यक नहीं हो सकती है, लेकिन फाइलों को संशोधित करते समय आप बहुत सतर्क नहीं हो सकते।


यह सब कर रहा है reading filenames from STDINमैं पहले से ही पेरेंट फ़ोल्डर के अंदर लटका हुआ हूं, जहां ये सभी फाइलें हैं
केविन

@ केविन "यदि कमांड लाइन पर कोई फ़ाइल नाम नहीं दिया गया है, तो फ़ाइलनाम मानक इनपुट के माध्यम से पढ़ा जाएगा।" और चूँकि शेल निकल *NEWER*जाता है जैसे कि कोई विस्तार नहीं मिला है, तो आपने एक गलती की होगी, या एक शेल का उपयोग कर रहे हैं जो एक बेजोड़ वाइल्डकार्ड को कुछ भी नहीं के साथ बदल दिया है।
मूरू

कॉपी किया और चिपकाया, Ubuntu 14.10 खोल में
केविन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.