linux

2012-08-04 20 views
21

में नियमित अभिव्यक्ति का उपयोग करके फ़ाइलें नाम बदलें मैं की तरह नामित फ़ाइलों का एक सेट है:linux

Friends - 6x03 - Tow Ross' Denial.srt 
Friends - 6x20 - Tow Mac and C.H.E.E.S.E..srt 
Friends - 6x05 - Tow Joey's Porshe.srt 

और मैं उन्हें निम्नलिखित

S06E03.srt 
S06E20.srt 
S06E05.srt 

क्या मैं काम करने के लिए क्या करना चाहिए जैसे नाम बदलना चाहते हैं लिनक्स टर्मिनल में किया गया? मैं नाम बदलने स्थापित किया है लेकिन यू का उपयोग कर त्रुटियों मिल निम्नलिखित:

rename -n 's/(\w+) - (\d{1})x(\d{2})*$/S0$2E$3\.srt/' *.srt 

उत्तर

35

आप तारांकन के सामने एक डॉट भूल गया:

rename -n 's/(\w+) - (\d{1})x(\d{2}).*$/S0$2E$3\.srt/' *.srt 

OpenSUSE, RedHat, Gentoo पर आप की पर्ल संस्करण का उपयोग करने के लिए है renameThis answer दिखाता है कि इसे कैसे प्राप्त किया जाए। आर्क पर, पैकेज को perl-rename कहा जाता है।

+2

ओपनएसयूएसई, रेडहाट, जेनेटू 'नाम बदलें' – mmrmartin

+0

@mmrmartin में regex का समर्थन नहीं करता है: यहां इस्तेमाल की जाने वाली नाम का नाम लैरी वॉल द्वारा लिखा गया है। यह फ़ाइल '/ usr/bin/rename' फ़ाइल में उपयोग किया जाता है, लेकिन शायद इसका नाम बदल दिया गया है (कोई इरादा नहीं है)? डेबियन पर स्क्रिप्ट नाम अब '/ usr/bin/file-rename' है। – Thor

+1

openSUSE 'उपयोग-लिनक्स' पैकेज से नाम का उपयोग करता है, मुझे' फ़ाइल-नाम ',' उन्माद 'या' perl-rename 'प्रदान करने वाला कोई भी पैकेज नहीं मिला - केवल कार्य समाधान [सीपीएन का उपयोग करके स्थापित करें] (http: // मेरे लिए stackoverflow.com/a/32862278/1392034)। – mmrmartin

7

प्रत्येक डिस्ट्रो जहाज rename उपयोगिता नहीं है जो उपरोक्त उदाहरणों में रेडहाट, जेनेटू और उनके डेरिवेटिव्स के रूप में उपयोग किए गए रेगेक्स का समर्थन करता है।

उपयोग करने का प्रयास करने के लिए विकल्प perl-rename और mmv हैं।

0

आप rnm उपयोग कर सकते हैं:

rnm -rs '/\w+\s*-\s*(\d)x(\d+).*$/S0\1E\2.srt/' *.srt 

स्पष्टीकरण:

  1. -rs: फार्म की स्ट्रिंग की जगह /search_regex/replace_part/modifier
  2. (\d) और (\d)x(\d+) में (\d+) दो पर कब्जा कर लिया groupes (\1 और \2 क्रमशः) कर रहे हैं ।

अधिक उदाहरण here

4

संपादित करें:IFS और ls का उपयोग करते समय अभी भी sh अनुरूप किया जा रहा बिना फ़ाइलों की सूची के लिए एक बेहतर रास्ता मिल गया।

मुझे लगता है कि के लिए एक खोल स्क्रिप्ट करना होगा:

#!/bin/sh 
for file in *.srt; do 
    if [ -e "$file" ]; then 
    newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0\1E\2.srt/'` 
    mv "$file" "$newname" 
    fi 
done 

पिछला स्क्रिप्ट:

#!/bin/sh 
IFS=' 
' 
for file in `ls -1 *.srt`; do 
    newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0\1E\2.srt/'` 
    mv "$file" "$newname" 
done 
+0

इस उदाहरण में 'IFS =' \ n'' क्या खड़ा है? मुझे यह पसंद है क्योंकि यह किसी विशेष चीज़ का उपयोग नहीं करता है। – Szobi

+0

आईएफएस: आंतरिक फील्ड विभाजक जो विस्तार के बाद शब्द विभाजन के लिए उपयोग किया जाता है और पढ़ने के लिए कमांड कमांड के साथ शब्दों में विभाजित करता है। डिफ़ॉल्ट मान "" - (मैन बैश से) है। इसे \ \ n' में बदलना प्रति पंक्ति एक फ़ाइल प्राप्त करने की अनुमति देता है। – Creak

0

अगर आपके linux प्रदान नहीं करता है नाम बदलने, आप भी इस्तेमाल कर सकते हैं निम्नलिखित:

find . -type f -name "Friends*" -execdir bash -c 'mv "$1" "${1/\w+\s*-\s*(\d)x(\d+).*$/S0\1E\2.srt}"' _ {} \; 

मैं अपने कंसोल में रेगेक्स के साथ प्रतिस्थापन करने के लिए अक्सर इस स्निपेट का उपयोग करता हूं।

मैं खोल-सामान में बहुत अच्छा नहीं हूँ, लेकिन जहाँ तक मैं इस कोड को समझते हैं, इसकी व्याख्या की तरह होगा: की खोज परिणामों अपने लगता है एक बैश कमान (बैश को पारित किया जाएगा - सी) जहां आपका खोज परिणाम स्रोत फ़ाइल के रूप में $ 1 के अंदर होगा। लक्ष्य है कि इस प्रकार एक subshell के भीतर एक प्रतिस्थापन, का परिणाम है जहां $ 1 की सामग्री (यहाँ: बस अपने पैरामीटर-substituion अंदर { // लगता है/बदलें}) भी होगा आपके परिणाम खोजें। {}-execdir

बेहतर स्पष्टीकरण की सामग्री के लिए पर यह गुजरता है एक बहुत :) सराहना की जाएगी

कृपया ध्यान दें: मैं केवल अपने रेगुलर एक्सप्रेशन से कॉपी-पेस्ट किया; उदाहरण फाइलों के साथ पहले इसे जांचें। आपके सिस्टम के आधार पर आपको [d: digit:]] या [[: अल्फा:]] जैसे वर्ण वर्गों में \ d और \ w को बदलने की आवश्यकता हो सकती है। हालांकि, \ 1 समूहों के लिए काम करना चाहिए।

1

mmv सरल लेकिन उपयोगी है। यह मिलान स्ट्रिंग में किसी भी वर्ण के लिए * और स्ट्रिंग स्ट्रिंग में #X के लिए ? का उपयोग करता है ताकि एक्स-वें मैच को संदर्भित किया जा सके।

आपके मामले में:

mmv 'Friends - 6x?? - Tow *.srt' 'S06E#1#2.srt' 

यहाँ #1#2 दो अंक जिसके द्वारा (# 1 मैच और # 2) ?? कब्जा कर लिया है प्रतिनिधित्व करते हैं।

mmv भी [ और ] और ; से मिलान प्रदान करता है, और अधिक के लिए आदमी पृष्ठ को पढ़ने!

1

वास्तव में शांत lil diddy।

xargs -n2 प्रति पंक्ति दो तर्क मुद्रित करना संभव बनाता है। जब पर्ल के print $_ (पहले $ STDIN प्रिंट करने के लिए) के साथ संयुक्त किया जाता है, तो यह एक शक्तिशाली नामकरण उपकरण बनाता है। की perl -pe 'print $_; s/OldName/NewName/' | xargs -n2 अंत तक किया जा रहा है

find . -type f | perl -pe 'print $_; s/DVDCover/DVDCoverLabel/' | xargs -n2 mv 

परिणाम:

OldName.ext NewName.ext 
OldName.ext NewName.ext 
OldName.ext NewName.ext 
OldName.ext NewName.ext 

मैं पर्ल के rename आसानी से अपने सिस्टम पर उपलब्ध नहीं था।