बाश में फिल्नामें में अनुगामी पात्रों को कैसे हटाया जाए?


13

मेरे पास नीचे की तरह मीडिया फ़ाइलों का एक गुच्छा है:

tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi

मैं उनका नाम बदलना चाहूंगा

tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi

मैंने नाम बदलने की कोशिश की है, लेकिन जाहिर है कि मुझे सिंटैक्स सही नहीं मिल रहा है क्योंकि यह विफल रहता है।


यदि आप कभी भी एक गिनी में ऐसा करना चाहते हैं, krenameतो प्यारा है। इसमें सभी प्रकार के शक्तिशाली विकल्प हैं और आपको दिखाता है कि वास्तव में ऐसा करने से पहले यह क्या करने जा रहा है। आप इसका उपयोग उन पैटर्नों का परीक्षण करने के लिए भी कर सकते हैं जिन्हें आप बाद में उपयोग कर सकते हैं।
जो

जवाबों:


9

यह फ़ाइलों का नाम बदल देगा। किसी भी संख्या में अल्फ़ान्यूमेरिक वर्णों को दर्शाने के लिए आपको \ w * की आवश्यकता होती है।

rename 's/\]\w*//' *

संदर्भ: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#UsingSimpleWildcards


5
ध्यान दें कि इसके लिए पर्ल renameउपयोगिता की आवश्यकता होती है , न कि उपयोग -लिनेक्स से एक ही नाम के साथयहां और यहां
ilkkachu

14

खोल में, एक बस कर सकता है:

for x in *]*.avi ; do 
    mv -i "$x" "${x%]*.avi}.avi"
done

शेल सिर्फ एक नियमित ग्लोब के साथ फाइलनाम की एक सूची का उत्पादन कर सकता है, और ${var%pattern}चर में स्ट्रिंग के अंत से (सबसे छोटा) मिलान पैटर्न निकालता है var। चूंकि अंतिम विस्तार हमेशा होता है .avi, इसलिए मैंने इसे पैटर्न के साथ हटा दिया और इसे वापस जोड़ दिया। उद्धरण के साथ, यह फ़ाइल नामों के साथ काम करना चाहिए जिसमें रिक्त स्थान भी हों, जैसेFancy Name for a Show.s01e01]Asdf.avi


@ नोविसेक एक्सग्लोब पैटर्न एक बुरा विचार नहीं था। दरअसल, ऐसा कुछ ${x/]*([^.])}करना चाहिए, यह एक ब्रैकेट और किसी भी गैर-डॉट्स को हटा देता है। (हालांकि विफल रहता है अगर वहाँ अन्य कोष्ठक या डॉट्स हैं, क्योंकि यह स्ट्रिंग के अंत में बंद नहीं है)
ilkkachu

ये एक अच्छा बिंदु है। लेकिन मैं वास्तव में सिर्फ इस मुद्दे को अधिरोहित करता हूं जब मुझे साथ जाना चाहिए था ${x/]*.avi}और बस .aviआपको एक तरह से जोड़ा गया था । लेकिन मैं इस बात से भी असंतुष्ट था कि नाम के स्थान कैसे टूटेंगे (`find . -name '*]*.avi'`)। मैं एक सीमित मानक यूनिक्स कमांड विधि प्रदान करने के लिए खुश था, क्योंकि नाम नहीं है, लेकिन यह मुझे पानी से बाहर निकालता है।
नौसिखिया सी

2

यह सभी प्रकार के अव्यावहारिक है - अन्य उत्तर बहुत तेज़ और छोटे हैं - लेकिन ...

आप PowerShell का उपयोग कर सकते हैं! माइक्रोसॉफ्ट ने हाल ही में इसे ओपन-सोर्स किया और इसे क्रॉस-प्लेटफॉर्म बनाया। अपने ओएस के लिए डाउनलोड और इंस्टॉलेशन निर्देशों के लिए, "पावरशेल प्राप्त करें" अनुभाग देखें

एक बार जब आप इसे स्थापित कर लेते हैं, तो आप इस संक्षिप्त स्क्रिप्ट का उपयोग कर सकते हैं:

Get-ChildItem -File '*]*.avi' | ForEach-Object {
    Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}

मूल रूप से, यह वर्तमान निर्देशिका में प्रत्येक ऑब्जेक्ट से गुजरता है जो एक फ़ाइल मिलान है *]*.avi, ब्रैकेट से पहले का हिस्सा मिलता है, उस .aviपर वापस जाता है, और नए नाम के रूप में असाइन करता है।

इसे सीधे बैश से चलाने के लिए, इस सेमी-गोल्फ वाले वन-लाइनर का उपयोग करें:

powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'

इस स्टैक ओवरफ्लो जवाब के सौजन्य से बचने वाले भाव ।

(विंडोज पर उबंटू में बैश में परीक्षण किया गया। पावरशेल के साथ ऐसा करने का शायद बहुत कम तरीका है, लेकिन मैं कुछ ऐसा दिखाना चाहता था जो उन लोगों के लिए समझ में आता है जो नियमित अभिव्यक्ति नहीं जानते हैं।)


गर्व होगा गोल्डबर्ग! Regexes सीखने के लिए एक वास्तविक PITA हैं, लेकिन वे कई बार इसके लायक हैं - यहां तक ​​कि अल्पविकसित स्तर पर मैं उनका उपयोग करने में सक्षम हूं।
जो

1

डेबियन के पास एमएमवीवी नामक एक पैकेज है जो अन्य डिस्ट्रोस में भी उपलब्ध हो सकता है, और स्रोत से संकलन करने के लिए पर्याप्त आसान होना चाहिए यदि नहीं। यह आपको यह लिखने की अनुमति देता है:

mmv '*]*.avi' '#1.avi'

आप अधिक विवरण के लिए इस आदेश के लिए Ubuntu मैन पेज पढ़ सकते हैं ।


0

यह पैटर्न की खोज करेगा और sed का उपयोग करके पाठ को प्रतिस्थापित करेगा।

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.