बड़े पैमाने पर नामकरण, * निक्स संस्करण


11

मैं एक समान नाम वाली फ़ाइलों की एक बड़ी संख्या का नाम बदलने के लिए एक रास्ता खोज रहा था, बहुत कुछ इस तरह (एक विंडोज से संबंधित प्रश्न) को छोड़कर, मैं * निक्स (उबंटू और फ्रीबीएसडी, अलग से) का उपयोग कर रहा हूं। केवल शेल का उपयोग करने के लिए (बाश, सीएसएच, आदि) का उपयोग करते हुए मैं कैसे कई फाइलों का नाम बदल देता हूं, उदाहरण के लिए, निम्न फाइलें:

बीथोवेन - फर एलिसे। एमपी 3
बीथोवेन - मूनलाइट सोनाटा। एमपी 3
बीथोवेन - ओड टू जॉय. एमपी
बीथोवेन - लॉस्ट ओवर द लॉस्ट पेनी.mp3

इनका नाम बदला जाएगा?

फर Elise.mp3
मूनलाइट सोनाटा .mp3
Ode to Joy.mp3
Rage Over the Lost Penny.mp3

ऐसा करने का कारण यह है कि फ़ाइलों का ये संग्रह "बीथोवेन" (यानी फ़ाइल नाम के उपसर्ग) नामक एक निर्देशिका के अंतर्गत जाएगा, और फ़ाइल नाम पर यह जानकारी होने पर ही यह निरर्थक हो जाएगा।

जवाबों:


12

नाम की उपयोगिता वही करेगी जो आप चाहते हैं।

महज प्रयोग करें rename 's/Beethoven\ -\ //g' *.mp3


क्या आप उपयोगिता का लिंक प्रदान करने के लिए संपादन कर सकते हैं, या यह उल्लेखित (Ubuntu और FreeBSD) दोनों वितरणों में मानक है?
क्रिस डब्ल्यू। री।

1
यह पर्ल के साथ आता है। डेबियन इसका नाम बदलने के आदेश के रूप में उपयोग करता है, इसलिए मुझे संदेह है कि उबंटू भी करता है। एक और 'नाम बदलें' कमांड है जो बेकार है, इसलिए मैन पेज देखें।
derobert

वाह, नाम बदलने के वाक्यविन्यास की जगह बहुत समान लगती है: D
Dzung Nguyen

/ usr / port / sysutils / rename में पोर्ट पूरी तरह से FreeBSD में काम करता है
जोश डब्ल्यू।

10

लिनक्स / यूनिक्स के साथ बहुत सी चीजों की तरह, इसे करने का एक से अधिक तरीका है!

कुछ mmv (मास mv) का उपयोग कर सकते हैं ।

कुछ पर्ल पैकेज (नए उबंटू और डेबियन) के साथ आने वाले नाम, या prename कमांड भी ऐसा कर सकते हैं।

prename 's/Beethoven\ -\ //g' Beethoven*.mp3

ध्यान दें कि फेडोरा 10 पर नाम बदलने का उपकरण समान कार्यक्रम नहीं है और यह अलग तरह से काम करता है। यह एक अलग पैकेज, उपयोग-लिनेक्स-एनजी का हिस्सा है और यहां पाया जा सकता है

मैं अक्सर सिर्फ आदत से बाहर लूप के लिए शेल पर जाता हूं (ऐसे सभी उपकरण हमेशा मौजूद नहीं थे)।

mkdir -p Beethoven
for x in Beethoven\ -\ *
do
mv "$x" Beethoven/"${x/Beethoven - /}"
done

यह बीथोवेन डायरेक्टरी बनाएगा, फिर फाइल को उस डायरेक्टरी / फाइलनाम पर ले जाएगा, जहां फाइलनाम में "बीथोवेन -" कुछ भी नहीं है।

एक परीक्षण के रूप में, पहले:

$ ls
Beethoven - Fur Elise.mp3                 Beethoven - Ode to Joy.mp3
Beethoven - Moonlight Sonata.mp3          Beethoven - Rage Over the Lost Penny.mp3

उपरांत:

$ ls Beethoven/
Fur Elise.mp3                 Ode to Joy.mp3
Moonlight Sonata.mp3          Rage Over the Lost Penny.mp3

4

इस समाधान का प्रयास करें, grep और नाम बदलने के संयोजन का उपयोग करके। यह मान रहा है कि आपके पास निर्देशिकाओं का एक पूरा समूह है जिसे आपको नाम बदलने की आवश्यकता है। यदि कुछ ही हैं, तो मैं "आर्टिस्ट -" पैटर्न के साथ प्रत्येक के लिए हार्डकोड के साथ मैनुअल दृष्टिकोण के साथ जाऊंगा।

# Rename any mp3 files in the directory hierarchy of type "a - b.mp3" to "b.mp3"
find . -name "*.mp3" -exec rename -n -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;

का स्पष्टीकरण खोजने : खोजने के आदेश के साथ सभी फ़ाइलों को पाता है .mp3 वर्तमान फ़ाइल पदानुक्रम में विस्तार, और तर्क के लिए पारित कॉल -exec प्रत्येक के लिए। ध्यान दें कि -exec के भीतर , {} खोज (फ़ाइल पथ + नाम) द्वारा पारित तर्क को संदर्भित करता है । यह सुनिश्चित करता है कि नाम बदलने के आदेश को समाप्त करने के बजाय नाम बदल दिया जाए
\;;

ऊपर दी गई कमांड में -n (कोई क्रिया नहीं) स्विच है; इसलिए यह केवल आपको बताएगा कि अगर आप इसे चलाते हैं तो क्या होगा। मैं आपको केवल एक बार चलाने के बाद इस कमांड को चलाने की सलाह देता हूं और प्रस्तावित परिणामों से संतुष्ट हूं।

अब regexp के लिए।

  • ^ मैच स्ट्रिंग की शुरुआत।
  • $ स्ट्रिंग के अंत से मेल खाता है।
  • . किसी भी पात्र से मेल खाता है।
  • *पूर्ववर्ती निर्माण का मतलब शून्य या अधिक है। उदाहरण का .*अर्थ है शून्य या अधिक वर्ण।
  • \s किसी भी अंतरिक्ष चरित्र के लिए खड़ा है।
  • \S किसी भी गैर-अंतरिक्ष चरित्र के लिए खड़ा है।
  • कुछ भी भीतर ()कब्जा कर लिया जाता है और के रूप में देखा जा सकता है $1, $2अपनी स्थिति पर निर्भर करता है।

Regexp:

  • शुरू में एक वैकल्पिक निर्देशिका संरचना की तलाश करता है, इसे $ 1 में कैप्चर करता है: (.*/)
  • " -" तक सब कुछ छोड़ देता है :.*-
  • $ 2 में अग्रणी और अनुगामी स्थानों को छोड़कर बाकी स्ट्रिंग को कैप्चर करता है: (.*)
  • फ़ाइल को $ 1 $ 2 के रूप में फिर से लिखा जाता है, जिसे "/path/to/file/""filen.nic.in" होना चाहिए।

यहाँ मेरा टेस्ट रन है:

/tmp/test$ ls -R
.:
a  b  c  z-unknown.mp3

./a:
a3.mp3                 a - longer title3.mp3  c.mp3   disc2
a - longer title2.mp3  a - long title.mp3     disc 1  the band - the title.mp3

./a/disc 1:
a - title1.mp3  a - title2.mp3

./a/disc2:
a - title1.mp3  a - title2.mp3

./b:
cd - ab - title3.mp3  cd - title1.mp3  cd - title2.mp3  c.mp3

./c:
c-pony2.mp4  c - pony3.mp3  c - pony4.mp3  c-pony.mp3

/tmp/test$ find . -name "*.mp3" -exec rename -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;
./c/c-pony.mp3 renamed as ./c/pony.mp3
./c/c - pony4.mp3 renamed as ./c/pony4.mp3
./c/c - pony3.mp3 renamed as ./c/pony3.mp3
./z-unknown.mp3 renamed as ./unknown.mp3
./a/the band - the title.mp3 renamed as ./a/the title.mp3
./a/a - longer title2.mp3 renamed as ./a/longer title2.mp3
./a/a - longer title3.mp3 renamed as ./a/longer title3.mp3
./a/disc 1/a - title1.mp3 renamed as ./a/disc 1/title1.mp3
./a/disc 1/a - title2.mp3 renamed as ./a/disc 1/title2.mp3
./a/a - long title.mp3 renamed as ./a/long title.mp3
./a/disc2/a - title1.mp3 renamed as ./a/disc2/title1.mp3
./a/disc2/a - title2.mp3 renamed as ./a/disc2/title2.mp3
./b/cd - title1.mp3 renamed as ./b/title1.mp3
./b/cd - title2.mp3 renamed as ./b/title2.mp3
./b/cd - ab - title3.mp3 renamed as ./b/title3.mp3

/tmp/test$ ls -R
.:
a  b  c  unknown.mp3

./a:
a3.mp3  c.mp3  disc 1  disc2  longer title2.mp3  longer title3.mp3  long title.mp3  the title.mp3

./a/disc 1:
title1.mp3  title2.mp3

./a/disc2:
title1.mp3  title2.mp3

./b:
c.mp3  title1.mp3  title2.mp3  title3.mp3

./c:
c-pony2.mp4  pony3.mp3  pony4.mp3  pony.mp3

Regexp के ट्रिकी व्यवसाय हैं, और मैंने उन्हें लिखने का एक दोष दिया है, इसलिए मैं इस एक की योग्यता की कमी पर किसी भी इनपुट का स्वागत करता हूं। मुझे पता है कि मैंने इसे कुछ परीक्षण पाया।


1

मैंने एक कमांड-लाइन जावा प्रोग्राम को रखा है जो फ़ाइलों (और निर्देशिकाओं) का नाम बदलकर एक हवा बनाता है, विशेष रूप से स्क्रिप्टिंग के लिए। यह मुफ़्त और खुला स्रोत है, इसलिए आप इसे अपने दिल की सामग्री में संशोधित कर सकते हैं:

नाम बदलें
http://renamewand.sourceforge.net/

कुछ प्रासंगिक उपयोग उदाहरण:

फ़ॉर्म की फ़ाइलों "<a> - <b>"को उनकी संबंधित निर्देशिका में ले जाएं "<a>":

java -jar RenameWand.jar  "<a> - <b>"  "<a>/<b>"

अंतिम-संशोधित समय के अनुसार फ़ाइलों को क्रमबद्ध करें, और उन्हें 3-अंकीय संख्या के साथ नाम बदलें:

java -jar RenameWand.jar  "<a>"  "<3|#FT> <a>"

फ़ाइल नाम के हिस्सों को फिर से व्यवस्थित करें, और मामला बदलें:

java -jar RenameWand.jar  "<album> - <artist> - <song>.<ext>" 
                          "<artist.upper> <album.title> - <song>.<ext.lower>"

1

zmv Zsh नाम बदलने का उपकरण बहुत अच्छा है।

# zmv "programmable rename"
# Replace spaces in filenames with a underline
zmv '* *' '$f:gs/ /_'
# Change the suffix from *.sh to *.pl
zmv -W '*.sh' '*.pl'
# lowercase/uppercase all files/directories
$ zmv '(*)' '${(L)1}' # lowercase
$ zmv '(*)' '${(U)1}' # uppercase

अधिक नोट यहां ...


0

पेंगुइन प्रमुखों के लिए यह आसानी से एक शेल स्क्रिप्ट या AWK स्क्रिप्ट में किया जाता है। हमारे लिए केवल नश्वर आप आधी रात कमांडर की कोशिश करना चाहते हो सकता है। यह एक शेल प्रॉम्प्ट प्रकार mc -a से अधिकांश लिनक्स वितरण पर है। आप नियमित अभिव्यक्तियों का उपयोग करके फ़ाइलों का नाम बदल सकते हैं। मैंने मेरी मदद करने के लिए GeekStuff http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/ पर लेख का उपयोग किया ।


0

यहाँ एक सरल कमांड-लाइन उदाहरण है। मेरे पास "सफेद" शब्द था, जो पीएनजी फाइलों के एक समूह के नाम के बीच में था। मैं इसे बाहर निकालना चाहता था और सिर्फ एक अंडरस्कोर छोड़ना चाहता था। इसने किया चाल:

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

0

नाम बदलने के पैटर्न को लागू करने के लिए vidir का उपयोग करें और फिर अपनी संपादक सुविधाओं का उपयोग करें।

नाम

vidir - निर्देशिका संपादित करें

SYNOPSIS

vidir [--verbose] [निर्देशिका | फ़ाइल | -] ...

विवरण

vidir एक टेक्स्ट एडिटर में डायरेक्टरी की सामग्री के संपादन की अनुमति देता है। यदि कोई निर्देशिका निर्दिष्ट नहीं है, तो वर्तमान निर्देशिका संपादित की जाती है।

किसी निर्देशिका का संपादन करते समय, निर्देशिका का प्रत्येक आइटम अपनी स्वयं की क्रमांकित पंक्ति में दिखाई देगा। ये संख्याएँ बताती हैं कि विदिर किस चीज़ के बदले जाने पर नज़र रखता है। निर्देशिका से फ़ाइलों को निकालने के लिए लाइनों को हटाएं, या फ़ाइल का नाम बदलने के लिए फ़ाइल नाम संपादित करें। आप फ़ाइल नाम स्वैप करने के लिए संख्याओं के जोड़े भी स्विच कर सकते हैं।

ध्यान दें कि यदि "-" को संपादित करने के लिए निर्देशिका के रूप में निर्दिष्ट किया गया है, तो यह स्टडेन से फ़ाइलनाम की एक सूची पढ़ता है और संपादन के लिए प्रदर्शित करता है। वैकल्पिक रूप से, कमांड लाइन पर फाइलों की एक सूची निर्दिष्ट की जा सकती है।

उदाहरण

vidir vidir * .jpeg विशिष्ट उपयोग।

खोजो | vidir - उपनिर्देशिका सामग्री भी संपादित करें। उपनिर्देशिकाओं को हटाने के लिए, उनकी सभी सामग्री और उपनिर्देशिका को स्वयं संपादक में हटा दें।

find -type f | vidir - वर्तमान निर्देशिका और उपनिर्देशिकाओं के तहत सभी फाइलों को संपादित करें।

लेखक

जॉय हेस 2006-2010

2011 मैग्नस वोल्ड्रिच द्वारा संशोधन

कॉपीराइट

कॉपीराइट 2006-2011 vidir "AUTHOR" जैसा कि ऊपर सूचीबद्ध है।

जीएनयू जीपीएल के तहत लाइसेंस प्राप्त है।


0

* renameउपलब्ध बिना पर्ल पर एक निक्स

कुछ * nix पर कोई नाम उपलब्ध नहीं है, इसलिए यह आवश्यक है कि कुछ अन्य विधि का उपयोग करके नाम बदलें। कुछ साल पहले मैंने zmvयहां सुझाव दिया था , जबकि महान, आवश्यक रूप से उपलब्ध नहीं है।

बिल्डिंस और सेड का उपयोग करके, हम जल्दी से एक शेल स्क्रिप्ट को व्हिप कर सकते हैं ऐसा करने के लिए जो हमें पर्ल नाम की स्क्रिप्ट के समान सिंटैक्स देता है, जबकि कुछ त्रुटि से निपटने में कमी होती है, यह काम पूरा हो जाता है।

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      mv -v "$file" "$(sed $sed_pattern <<< $file)"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

प्रयोग

sedrename 's/Beethoven\ -\ //g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

कहते हैं कि हम लक्ष्य फ़ोल्डर भी बनाना चाहते थे ...

चूंकि mvहम उन फ़ोल्डरों का निर्माण नहीं करते हैं जिनका उपयोग हम यहां नहीं कर सकते sedrename, लेकिन यह काफी छोटा बदलाव है, इसलिए मुझे लगता है कि इसे भी शामिल करना अच्छा होगा।

हमें एक उपयोगिता फ़ंक्शन, abspath(या पूर्ण पथ) की आवश्यकता है ताकि हम एक फ़ोल्डर / फ़ोल्डर नाम संरचना के लिए लक्ष्य फ़ोल्डर (ओं) को उत्पन्न कर सकें जिसमें अन्य फ़ोल्डर संरचना शामिल है।

abspath () { case "$1" in
               /*)printf "%s\n" "$1";;
               *)printf "%s\n" "$PWD/$1";;
             esac; }

यह सुनिश्चित करेगा कि हम अपने लक्ष्य फ़ोल्डर के नाम जानते हैं। जब हम नाम बदलते हैं तो हमें लक्ष्य फ़ाइल नाम पर इसका उपयोग करने की आवश्यकता होगी।

# generate the rename target
target="$(sed $sed_pattern <<< $file)"

# Use absolute path of the rename target to make target folder structure
mkdir -p "$(dirname $(abspath $target))"

# finally move the file to the target name/folders
mv -v "$file" "$target"

यहां जानिए पूरा फोल्डर जानिए स्क्रिप्ट ...

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      target="$(sed $sed_pattern <<< $file)"
      mkdir -p "$(dirname $(abspath $target))"
      mv -v "$file" "$target"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

बेशक, यह तब भी काम करता है जब हमारे पास विशिष्ट लक्ष्य फ़ोल्डर भी नहीं होते हैं।

यदि हम सभी गीतों को फ़ोल्डर में रखना चाहते हैं, ./Beethoven/तो हम यह कर सकते हैं:

प्रयोग

sedrename 's|Beethoven - |Beethoven/|g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

बोनस दौर ...

एक फ़ोल्डर में फ़ाइलों को फ़ोल्डर से स्थानांतरित करने के लिए इस स्क्रिप्ट का उपयोग करना:

यह मानते हुए कि हम मिलान की गई सभी फ़ाइलों को इकट्ठा करना चाहते हैं, और उन्हें वर्तमान फ़ोल्डर में रखें, हम यह कर सकते हैं:

sedrename 's|.*/||' **/*.mp3

before:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

after:

./Beethoven/ # (now empty)
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

Sed रेगेक्स पैटर्न पर ध्यान दें

इस स्क्रिप्ट में नियमित सेड पैटर्न नियम लागू होते हैं, ये पैटर्न पीसीआरई (पर्ल कम्पेटिबल रेगुलर एक्सप्रेशंस) नहीं हैं। आपके प्लेटफॉर्म पर sed -rया तो या sed -Eआपके आधार पर , आप एक्सटेंडेड रेगुलर एक्सप्रेशन सिंटैक्स का इस्तेमाल कर सकते हैं।

POSIX अनुपालन man re_formatको सीड बेसिक और विस्तारित रेगेक्स पैटर्न के पूर्ण विवरण के लिए देखें ।

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