मैं एक चरित्र या स्ट्रिंग को हटाकर कई फ़ाइलों का नाम कैसे बदल सकता हूं?


21

मेरे पिछले प्रश्न के अनुवर्ती के रूप में , अगर मेरे पास फॉर्म की कई फाइलें हैं

sw.ras.001
sw.ras.002
sw.ras.003
…

ras.सभी फ़ाइलों के बीच में निकालने के लिए मैं किस कमांड का उपयोग कर सकता हूं ?


आप हटाना चाहते हैं केवलras , यानी साथ खत्म sw..001, या ras., छोड़ने sw.001?
केविन

मैं शायद 'रास' निकालना चाहता हूँ। क्या कमांड बहुत अलग होगी?
पॉल

नहीं, बस आप \.पैटर्न में शामिल हैं या नहीं ।
केविन

जवाबों:


35

आप अंतिम प्रश्न से उत्तर के काफी छोटे संशोधन के साथ ऐसा कर सकते हैं:

rename s/ras\.// sw.ras.*

या

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

स्पष्टीकरण:

renameएक perlस्क्रिप्ट है जो एक perlनियमित अभिव्यक्ति और फ़ाइलों की एक सूची लेती है , बदले में प्रत्येक फ़ाइल के नाम पर रेगेक्स लागू करती है, और प्रत्येक फ़ाइल का नाम रीगेक्स लागू करने के परिणाम में बदल देती है। हमारे मामले में, शाब्दिक रूप से मेल खाता है rasऔर \.एक शाब्दिक .रूप से मेल खाता है (जैसा कि .अकेले एक नई रेखा के अलावा किसी भी चरित्र को इंगित करता है), और यह बदले में कुछ भी नहीं करता है।

forपाश सभी फ़ाइलें के साथ शुरू लेता है sw.ras.उन पर (मानक खोल ग्लोब) और छोरों। पहली घटना को ${var/search/replace}खोजता $varहै searchऔर उसके साथ बदल देता है replace, इसलिए पहले निकाले गए ${file/ras./}रिटर्न के $fileसाथ ras.। कमांड इस प्रकार फ़ाइल को उसी नाम माइनस में बदल देती है ras.। ध्यान दें कि इस खोज के साथ और प्रतिस्थापित किया जाता है, .सचमुच लिया जाता है, विशेष चरित्र के रूप में नहीं।


क्या आप दूसरों से अपना जवाब समझा सकते हैं? क्या "s / ras \ .// sw.ras। *" करते हैं? मुझे लगता है कि मैं इसे जानता हूं, लेकिन मैं निश्चित होना चाहता हूं, और अन्य भी सीख सकते हैं। उसी तरह दूसरा विकल्प।
H_7

1
@ H_7 अच्छा विचार है, मैंने एक स्पष्टीकरण जोड़ा है।
केविन

14

एक अन्य विकल्प mmv (मास MoVe और नाम बदलना) का उपयोग करना है:

mmv '*ras.*' '#1#2'

अपने पैटर्न के चारों ओर एकल उद्धरण का उपयोग करने के लिए मत भूलना, अन्यथा तारों को शेल स्तर पर विस्तारित किया जाएगा।

उपयोगिता हमेशा उपलब्ध नहीं होती है लेकिन यदि यह नहीं है, तो आप इसे स्थापित कर सकते हैं:

sudo apt-get install mmv

मैन पेज यहाँ देखें ।


1
यह एक महान उपकरण है !!!
ईसाई

5

किसी भी POSIX अनुरूप खोल (में bash, dash, ksh, आदि):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

या साथ rename:

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]

1

मुझे हाल ही में कई फाइलों का एक थोक नाम बदलना पड़ा, जहां मुझे एक चरित्र की अंतिम घटना को बदलना पड़ा, जहां चरित्र कई बार फाइलनाम में हुआ। इस विशेष मामले में मुझे अंतिम डैश -को एक अंडरस्कोर के साथ बदलना था _, इसे बदलकर:

some-long-file-name.ext

इस मामले में:

some-long-file_name.ext

इसमें कुछ समय लगा लेकिन इसने आखिरकार ऐसा किया:

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

यहाँ:

  • ${i%-*} डैश के अंतिम घटना तक फ़ाइल नाम की शुरुआत से मेल खाता है -
  • ${file##*-} डैश के अंतिम घटना के बाद शेष फ़ाइल नाम से मेल खाता है -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.