2012-06-15 13 views
16

के बीच में एकाधिक फ़ाइलों के छोटे से हिस्से का नाम बदलें मैं बस बदलने के लिए इसबैश: नाम

cc211_AMBER_13062012i.II cc211_GROMOS_13062012i.II 
cc211_CHARM_13062012i.II cc211_OPLS_13062012i.II 

को

cc211_AMBER_15062012i.II cc211_GROMOS_15062012i.II 
cc211_CHARM_15062012i.II cc211_OPLS_15062012i.II 

मैंने कोशिश की,

find -name "*.13 *" | xargs rename ".13" ".15" 

नहीं है करना चाहते हैं आम तौर पर 3 और दूसरे एस्टरिक्स के बीच कोई जगह नहीं है, जो कि मैं इसे देख सकता हूं, जो इसे देख सकता है। मूल रूप से फ़ाइल नाम के अंत में क्या करना है, इसके लिए बहुत सारे जवाब हैं, जहां एस्टेरिक्स काम करता प्रतीत होता है, लेकिन यहां मैं इसे काम नहीं कर सकता।

जो कुछ भी आपको मिला है वह मेरे जीवन को बहुत आसान बना देगा!

संपादित करें 1: परीक्षण

-bash-4.1$ ls 

cc211_AMBER_13062012.II cc211_GROMOS_13062012.II 
cc211_CHARM_13062012.II cc211_OPLS_13062012.II 

-bash-4.1$ rename 's/_13/_15/' cc* 
-bash-4.1$ ls 

cc211_AMBER_13062012.II cc211_GROMOS_13062012.II 
cc211_CHARM_13062012.II cc211_OPLS_13062012.II 

धन्यवाद,

चार्ली

+0

'क्यों नाम बदलने" .13 "" .15 " 'नाम बदलने के बजाय" _13 "" _15 "'? – chepner

उत्तर

22

कैसे इस बारे में:

for i in *.II; do mv $i $(echo $i | sed 's/_13/_15/g'); done 

इस विस्तार .II

अधिक जानकारी के साथ सभी फ़ाइलों में _15 साथ _13 का स्थान ले लेगा sed here पर।

6
rename 's/_13/_15/' cc* 

तुम क्या चाहते हो जाना चाहिए। नियमित अभिव्यक्ति s/_13/_15/_13_15 द्वारा 'सीसी' शुरू करने वाली सभी फ़ाइलों में प्रतिस्थापित करती है।

$ ls 
cc211_AMBER_13062012.II cc211_GROMOS_13062012.II 
cc211_CHARM_13062012.II cc211_OPLS_13062012.II 

$ rename 's/_13/_15/' cc* 

$ ls 
cc211_AMBER_15062012.II cc211_GROMOS_15062012.II 
cc211_CHARM_15062012.II cc211_OPLS_15062012.II 

यह केवल rename के नए पर्ल संस्करण के साथ काम करेंगे। यह जांचने के लिए कि आपने कौन सा संस्करण man rename किया है। पेज के शीर्ष कहते हैं

पर्ल प्रोग्रामर्स संदर्भ गाइड

आप पर्ल संस्करण है। यदि यह कहते हैं:

लिनक्स प्रोग्रामर के मैनुअल

आप मानक है (पुराने) संस्करण।

पुराने संस्करण के लिए, आदेश होना चाहिए:

rename _13 _15 cc* 
+0

मेरे खोल पर काम नहीं कर रहा था, 1 संपादित करें देखें? मैंने गलत क्या किया? – cc211

+1

मुझे लगता है कि हमारे पास 'नाम बदलें' कमांड के विभिन्न संस्करण हैं। मैंने अपने उत्तर को अधिक जानकारी के साथ संपादित किया है, उम्मीद है कि यह मदद करता है! –

+3

'नाम बदलें' पर्ल पैकेज में एक कमांड लाइन उपकरण है, जिसे 'प्रेनमेम' भी कहा जाता है। यह असीमित जटिल पर्ल अभिव्यक्ति का उपयोग कर सकता है, इसलिए 'prename -n' LWP :: सरल का उपयोग करें; मेरा $ http = get ("http: //airport-authority.com/browse-FR") ;while ($http=~m/>([^<> ]+ <\/a> \ ((\ w \ w \ w) \)/gc) {मेरा $ = $ 2 से; मेरा $ से = $ 1; $ से = ~ s// _/g; s/$ से/$ to/g}; ' MRS_DOLLY_PARTON.MP3 PUFF_DADDY.MP3' अंडरस्कोर के साथ फ्रेंच एयर पोर्ट नामों में फ़ाइल नामों में तीन अक्षर कोड का नाम बदल देगा, इस मामले में दो एमपी 3 का नाम बदलकर 'मार्सेल_एरपोर्ट_स्ट_गेटियन_एरपोर्टली_PARTON.MP3' और' Uzein_AirportF_DADDY.MP3' रखा जाएगा। –

19

एक शुद्ध bash समाधान:

for i in cc*; do 
    mv "$i" "${i/_13/_15}" 
done 
+0

यह काफी साफ है। –

+1

मैं इस तरह के उद्धरण जोड़ने का सुझाव दूंगा ताकि फ़ाइल नामों में रिक्त स्थान के साथ कोई समस्या न हो: मैं सीसी * में; एमवी "$ i" "$ {i/_13/_15}" करें; किया – syss

+0

@ user234461 नहीं, पैरामीटर विस्तार ग्लोब पैटर्न का उपयोग करते हैं, नियमित अभिव्यक्ति नहीं। – chepner

0

मैं एक शुद्ध लिनक्स समाधान का उपयोग कर रहा:

### find all files that contains _DES in name and duplicate them adding _AUXLOCAL 
for f in **/*_DES*; do 
    cp "$f" "${f%.DES}_AUXLOCAL" 
done 
###Rename all _AUXLOCAL files, removing _DES to _LOCAL 
for f in **/*_AUXLOCAL*; do 
    mv "$f" "${f/_DES/_LOCAL}" 
done 
###Rename all _AUXLOCAL files, removing _AUXLOCAL 
for f in **/*_AUXLOCAL*; do 
    mv "$f" "${f/_AUXLOCAL/}" 
done 

मुझे आशा है कि यह मदद करता है