MacOS टर्मिनल में फ़ाइल का नाम कैसे बदलें?


123

मेरे पास नाम की फ़ाइलों की एक श्रृंखला के साथ एक फ़ोल्डर है:

prefix_1234_567.png
prefix_abcd_efg.png

मैं बैच को एक अंडरस्कोर और मध्य सामग्री को निकालना चाहूंगा ताकि आउटपुट हो:

prefix_567.png
prefix_efg.png

प्रासंगिक लेकिन पूरी तरह से व्याख्यात्मक नहीं:


NSString और NSMutableString की रेंज और विकल्प विधियों को देखें
ग्रैडी प्लेयर

1
क्या आपने इसे गैर-टर्मिनल समाधान माना है? एक ऑटोमेकर वर्कफ़्लो इस प्रकार के संचालन को आसानी से कर सकता है। आप सभी फ़ाइलों का नाम बदलने और _*_रिक्त के साथ पाठ को बदलने के लिए एक स्वचालित वर्कफ़्लो बना सकते हैं ।
एन्क्रिप्ट

मुझे लगा कि
ऑटोमेकर

जवाबों:


234

अपने विशिष्ट मामले में आप निम्न bashआदेश का उपयोग कर सकते हैं ( bashmacOS पर डिफ़ॉल्ट शेल है):

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done

नोट: यदि कोई मौका है कि आपके फ़ाइलनाम के साथ शुरू होता है -, तो -- उनके सामने रखें [1]:
mv -- "$f" "${f/_*_/_}"

ध्यान दें: एक सूखा रन करने के echoलिए mvऐसा करने के लिए तैयार किया गया है। वास्तविक नाम बदलने के लिए इसे निकालें।

आप इसे कमांड लाइन से चला सकते हैं या स्क्रिप्ट में इसका उपयोग कर सकते हैं।

  • "${f/_*_/_}" का एक आवेदन है bash पैरामीटर विस्तार : (प्रथम) मिलान पैटर्न _*_को बदले में शाब्दिक के साथ बदल दिया जाता है_ , प्रभावी रूप से नाम से मध्य टोकन काट ।
  • ध्यान दें कि _*_एक पैटर्न है (वाइल्डकार्ड अभिव्यक्ति, जैसा कि ग्लोबिंग के लिए भी उपयोग किया जाता है), एक नियमित अभिव्यक्ति नहीं है (पैटर्न के बारे में जानने के लिए, रन करेंman bash और खोजें Pattern Matching)।

यदि आप अपने आप को बार-बार फ़ाइलों का नाम बदलकर पाते हैं, एक विशेष उपकरण जैसे पर्ल-आधारित renameउपयोगिता को स्थापित करने पर विचार करें । MacOS पर आप लोकप्रिय पैकेज मैनेजर होमब्रे का उपयोग करके इसे स्थापित कर सकते हैं:

brew install rename

यहां शीर्ष कमांड का उपयोग करते हुए बराबर है rename:

rename -n -e 's/_.*_/_/'  *.png

फिर, यह कमांड एक सूखी रन करता है; -nवास्तविक नामकरण करने के लिए निकालें ।

  • bashसमाधान के समान ,s/.../.../ पाठ प्रतिस्थापन करता है, लेकिन - इसके विपरीत bash- सच्चे नियमित अभिव्यक्ति का उपयोग किया जाता है।

[१] विशेष तर्क का उद्देश्य --, जो अधिकांश उपयोगिताओं द्वारा समर्थित है, यह संकेत देना है कि बाद के तर्कों को ऑपरेंड (मान) के रूप में माना जाना चाहिए , भले ही वे शुरू करने के कारण विकल्पों की तरह दिखते हों , जैसा कि जैकब सी।-


3
महान जवाब, पूरी तरह से काम किया। मैं यह भी सराहना करता हूं कि आपने इसे वापस समझाने के लिए इसे संपादित किया और इसे दोहराने पर अधिक सुरुचिपूर्ण समाधान प्रदान किया। फिर से, बहुत धन्यवाद, बहुत मददगार
किन्नर

4
मिलान किया प्रतिस्थापन का उपयोग कर एक उदाहरण ( .*-> $1), जैसे नाम बदलें Foo bar S01E01 biz baz.extकरने के लिए S01E01.ext:rename -n -e 's/.*(S[0-9]{2}E[0-9]{2}).*(\.[a-z]{2,4})/$1$2/' *
स्टीव रॉबिंस

2
echoसूखे रन के लिए उपयोग करने के विचार से प्यार करें । पारितोषिक के लिए धन्यवाद!
जेम्स राइट

अत्यधिक सिर्फ करने की सलाह देते हैंbrew install rename
क्रिस रेडफोर्ड

98

फ़ाइलों का नाम बदलने के लिए, आप का उपयोग कर सकते हैं rename उपयोगिता का :

brew install rename

उदाहरण के लिए, वर्तमान निर्देशिका में सभी फ़ाइल नाम में खोज स्ट्रिंग बदलने के लिए:

rename -nvs searchword replaceword *

परिवर्तनों को लागू करने के लिए 'एन' पैरामीटर निकालें।

और जानकारी: man rename


1
OS XGNU bash( x86_64-apple-darwin ) के संस्करणों में नाम उपयोगिता शामिल नहीं है।
l'L'l

4
धन्यवाद, हाँ इसके माध्यम से स्थापित करने की आवश्यकता हैbrew install rename
डेविड थॉमस

2
यह टिप कमाल की है! मैंने टाइप किया rename -vs GLYCOPHORIN GLYCC *और अब यह स्वतः 450+ फ़ाइलों का नाम बदल रहा है। और सुपर फास्ट भी।
Sander W. van der Laan

3
अति उत्कृष्ट! "शो क्या बदला जाएगा" भाग से प्यार करता हूँ क्योंकि यह वास्तव में चीजों का नाम बदल देता है!
बेन डफिन

3
आप एक रेगेक्स का भी उपयोग कर सकते हैं। नाम बदलें / 123 / onetwothree / g '*
ब्रायन

12

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

ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv

परिणाम:

prefix_567.png prefix_efg.png

* पहले एक ड्राई-रन करने के लिए, के mvसाथ अंत में बदलेंecho

स्पष्टीकरण:

  • e: केवल 1 sed कमांड के लिए वैकल्पिक।
  • p: इनपुट को sed में प्रिंट करने के लिए, इस मामले में यह किसी भी नाम बदलने से पहले मूल फ़ाइल नाम होगा
  • @: सेड को अधिक पठनीय बनाने के लिए / चरित्र का प्रतिस्थापन है। अर्थात, sed s / search / प्रतिस्थापित / g का उपयोग करने के बजाय, s @ search @ प्रतिस्थापित @ g का उपयोग करें
  • _। *: वास्तविक को संदर्भित करने के लिए अंडरस्कोर एक एस्केप चरित्र है। ' चरित्र शून्य या अधिक बार (regex में किसी भी वर्ण के विपरीत)
  • -n2: इंगित करता है कि 2 आउटपुट हैं जिन्हें पैरामीटर के रूप में एमवी पर पारित करने की आवश्यकता है। ls से प्रत्येक इनपुट के लिए , यह सेड कमांड 2 आउटपुट उत्पन्न करेगा, जो बाद में एमवी को आपूर्ति करेगा।

1
चालाक, अगर कुछ रहस्यमय समाधान। इसे और अधिक सामान्य बनाना, ताकि एम्बेडेड स्पेस के साथ फ़ाइलनामों का भी समर्थन किया जा सके, और भी अधिक रहस्यमय हो जाता है: ls * | xargs -I % bash -c 'echo mv "%" "$(sed 's@_.*_@_@' <<<"%")"'( echoवास्तव में नाम बदलें)।
mklement0

2
रहस्यमय? मुझे यह पसंद है!
बिलाल अकील

7

मेरे पास फ़ाइलों का एक बैच था जो इस तरह दिखता था: be90-01.png और डैश को अंडरस्कोर में बदलने की आवश्यकता। मैंने इसका इस्तेमाल किया, जिसने अच्छा काम किया:

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done

2

आप renameका उपयोग करके कमांड स्थापित कर सकते हैं brew। बस करो brew install renameऔर इसका इस्तेमाल करो।


1

का उपयोग करते हुए mmv

mmv '*_*_*' '#1_#3' *.png

आपको पहले स्थापित करने की आवश्यकता है sudo apt-get install mmv
α atsнιη

1
यह देखते हुए कि ओएस एक्स था, सही स्थापना प्रक्रिया है brew install mmv
buckaroo1177125 3

1

इसे इस्तेमाल करे

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done

यहाँ एक और तरीका है:

for file in Name*.png; do mv "$file" "01_$file"; done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.