फ़ाइल नाम में शब्द की जगह कई फ़ाइलों का नाम कैसे बदलें?


36

एसीसीडी को एसी-डीसी में बदलें

उदाहरण के लिए हमारे पास ये फाइलें हैं

ACDC - रॉक एन 'रोल एनाइस नॉट पॉल्यूशन।एक्सएक्सएक्स

एसीडीसी - रॉकर.एक्सएक्सएक्स

एसीडीसी - शूट टू थ्रिल.एक्सएक्सएक्स

मैं चाहता हूं कि वे बनें:

एसी-डीसी - रॉक एन 'रोल एनाइस नॉट पॉल्यूशन।एक्सएक्सएक्स

एसी-डीसी - रॉकर.एक्सएक्सएक्स

AC-DC - शूट टू थ्रिल.एक्सएक्सएक्स

मुझे पता है कि इस ऑपरेशन के लिए sed या awk का उपयोग किया जाता है। मैं कुछ भी Google नहीं कर सकता, इसलिए मैं आपकी सहायता के लिए पूछ रहा हूं =) क्या आप इस कार्य के लिए पूर्ण कार्य शेल कमांड प्रदान कर सकते हैं?

प्रतिक्रिया: OSX उपयोगकर्ताओं के लिए समाधान


1
मुझे लगता है कि यहाँ एक बड़ा सवाल है - क्या आप सामान्य रूप से एमपी 3 फ़ाइलनाम को ठीक करने की कोशिश कर रहे हैं? ऐसा करने के लिए लोगों ने कई स्क्रिप्ट लिखी हैं। मुझे लगता है कि मैंने जो उपयोग किया है उसे बुलाया गया था mp3fixer
फिल होलेनबैक

नहीं, यह एमपी 3 के बारे में नहीं है। मुझे बस इसी तरह के नामों के साथ कुछ विशाल फाइलों का प्रबंधन करना है, और कुछ को सब कुछ बदलना या तय करना होगा ... आम स्थिति इसलिए मुझे उन सभी का नाम बदलने के लिए इस निफ्टी समाधान की आवश्यकता है
14

जवाबों:


45
rename 's/ACDC/AC-DC/' *.xxx

से man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

उदाहरण के लिए, एक्सटेंशन स्ट्रिप करने के लिए "* .bak" से मेल खाती सभी फाइलों का नाम बदलने के लिए, आप कह सकते हैं

rename 's/\.bak$//' *.bak

अपरकेस नामों को कम करने के लिए, आप उपयोग करेंगे

rename 'y/A-Z/a-z/' *

5
ध्यान दें कि कई लिनक्स मशीनें उपयोग-लिनेक्स से नाम बदलने के साथ आती हैं, जो सरल प्रतिस्थापन को लागू करती हैं, न कि रेगेक्स। इसलिए अगर नाम बदले बिना कुछ किए चुपचाप विफल रहता है, तो आप शायद गलत का उपयोग कर रहे हैं rename
फिल होलेनबैक

मैं इसे युगों से खोज रहा था! thnx!
होम्स

@PhilHollenback कैसे सही एक को खोजने / स्थापित करने के लिए? :)
हेनरी

यह काम नहीं करता है जब मेरे पास रिक्त स्थान के बजाय मेरे फ़ाइल नाम में अंडरस्कोर है - मैं इसे कैसे हल कर सकता हूं?
unfa

13

इस जवाब में अन्य सभी उत्तरों से अच्छे हिस्से हैं, जबकि इस तरह के विधर्मियों को छोड़ दिया गया है ls | while read

वर्तमान निर्देशिका:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

उपनिर्देशिका सहित:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

न्यूलाइन वर्ण वास्तव में फ़ाइल नाम में होने की संभावना नहीं है, इसलिए रिक्त स्थान वाले नामों के साथ काम करते समय यह सरल हो सकता है:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

9

renameउस फिल के उपयोग-लिनक्स संस्करण का उपयोग करने के लिए (उबंटू पर, इसे कहा जाता है rename.ul):

rename ACDC AC-DC ACDC*

या

rename.ul ACDC AC-DC ACDC*

1
आपका वैरिएंट सबसे अच्छा है =) Google में बहुत सारे बेवकूफ लेख खोजे और भेजें और जागें ... इस सरल ऑपरेशन के लिए जिसका नाम पहले से ही है।
होम्स

4

बैश शेल का उपयोग करना

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

नोट: उपयोग findकरने से वर्तमान निर्देशिका और निर्देशिकाओं के अंतर्गत प्रक्रिया होगी।


1

अपने खोल पर निर्भर करता है। Zsh में, मैं यह करूँगा:

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

शायद सबसे अच्छा समाधान नहीं है, लेकिन काम करता है।


1

बैश का उपयोग करना:

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

यदि आपके पास renameप्रोग्राम स्थापित है:

rename 's/ACDC/AC-DC/' *.xxx
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.