उचित छँटाई के लिए एक बार में सैकड़ों फ़ाइलों का नाम बदलना


23

मैं फ़ाइलों की एक टन, की तरह सभी नामित चीजें 1.jpg, 2.jpg, 3.jpg, और इतने पर करने के लिए 1439.jpg, हालांकि, मैं एक समस्या अपनी परियोजनाओं और alphabetizing से एक के साथ की है। यह आमतौर पर क्रम में जाना होगा 1.jpg, 10.jpg, 11.jpgऔर इतने पर।

मुझे फाइलों को नाम देने के लिए किसी तरह की आवश्यकता है ताकि वे प्रारूप में हों जैसे कि 00001.jpgसभी तरह से 01439.jpg

मैं इसे जल्दी और कुशलता से कैसे कर पाऊंगा?


क्या आप देख रहे हैं "प्राकृतिक छंटाई" है, हो सकता है इस में मदद करता है: askubuntu.com/questions/41390/...
फैबियन Blechschmidt

जवाब है कि एक सीधा जवाब नहीं है? ls -v unix.stackexchange.com/questions/33909/…
WernerCD

+1 क्योंकि मैंने ऐसा करने में असफल प्रयास किया है pyrenamer
पार्टो

@FabianBlechschmidt, मुझे ऐसे कार्यक्रम में इसकी आवश्यकता है जो नॉटिलस या इसके समान नहीं है। यह एक व्यक्तिगत परियोजना के लिए है।
काज वोल्फ

मुझे लगता है कि आपने प्राकृतिक छँटाई को लागू करने के बारे में सोचा है? लेकिन मैं समझता हूं, फाइलों का नाम बदलना काफी आसान है और अगर यह काम करता है, तो महान :)
फेबियन ब्लेस्च्मिड्ट

जवाबों:


35

उबंटू एक स्क्रिप्ट के साथ आता है rename। यह सिर्फ एक छोटी सी पर्ल स्क्रिप्ट है जिसमें कई शक्तिशाली थोक नाम बदलने की सुविधा है लेकिन सबसे अच्छा (इस मामले में) प्रतिस्थापन के दौरान पर्ल को चलाने की क्षमता है। परिणाम वास्तव में एक कॉम्पैक्ट समाधान है:

rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

यह अन्य- printfशैली के उत्तरों के समान है, लेकिन यह हमारे लिए है। उपरोक्त कोड 5-अंकीय संख्या (अग्रणी शून्य के एक चर संख्या सहित) के लिए है।

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

नोट: यह पूरी तरह से पोर्टेबल नहीं है। कई वितरण का उपयोग rename.ulसे util-linuxउनके डिफ़ॉल्ट के रूप में पैकेज renameद्विआधारी। यह एक महत्वपूर्ण चरणबद्ध विकल्प है (देखें man rename.ul) जो ऊपर नहीं समझेगा। यदि आप इसे एक ऐसे प्लेटफ़ॉर्म पर चाहते हैं जो पर्ल के नाम का उपयोग नहीं कर रहा है, तो पहले यह पता करें कि इसे कैसे स्थापित किया जाए।


और यहाँ एक परीक्षण हार्नेस है:

$ touch {1..19}.jpg

$ ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  1.jpg  3.jpg  5.jpg  7.jpg  9.jpg
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  2.jpg  4.jpg  6.jpg  8.jpg

$ rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

$ ls
00001.jpg  00005.jpg  00009.jpg  00013.jpg  00017.jpg
00002.jpg  00006.jpg  00010.jpg  00014.jpg  00018.jpg
00003.jpg  00007.jpg  00011.jpg  00015.jpg  00019.jpg
00004.jpg  00008.jpg  00012.jpg  00016.jpg

और एक उदाहरण उपसर्ग (हम कुछ अलग नहीं कर रहे हैं):

$ touch track_{9..11}.mp3 && ls
track_10.mp3  track_11.mp3  track_9.mp3

$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3  track_10.mp3  track_11.mp3

अगर मैं एक पर्ल व्यक्ति होता तो यह सही समाधान होता। वास्तव में साफ है।
एमजीपी

2
यह किसी भी पर्ल का उपयोग नहीं करता है, बस एक उपकरण है जो पहले से ही पर्ल में लिखा है।
रोब

1
इस मामले में यह एक एकल पर्ल कमांड को शामिल करता है लेकिन यह वास्तव में भारी उठाने नहीं है। sprintfपर्ल sprintfअन्य भाषाओं के समान व्यवहार करता है ।
ओली

21
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then  mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

संपादित करें

स्पष्टीकरण:

  • if [[ $f =~ [0-9]+\. ]] यह सुनिश्चित करता है कि केवल उन फ़ाइलों को जिनके नाम नंबर हैं (एक डॉट के बाद) का नाम बदला जा रहा है।
  • printf "%.5d" NUMBER अग्रणी शून्य जोड़ता है
  • "${f%.*}" एक्सटेंशन (.jpg) को काटता है और बस नंबर छोड़ देता है
  • .jpgदूसरी बैकटिक के बाद फ़ाइल एक्सटेंशन को फिर से जोड़ता है।

ध्यान दें कि यह केवल उन फ़ाइल नामों पर काम करेगा जो संख्याएँ हैं। गैर-गिने फ़ाइलों के लिए अग्रणी ज़ीरो लेफ्ट-पेडिंग को अलग प्रारूप की आवश्यकता होगी।

यदि आप इस आदेश को आज़माना चाहते हैं:

for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

संपादित करें 2

यह सुनिश्चित कर कमांड को सुरक्षित बनाया कि केवल नाम जो कि नंबर हैं, उन्हें नाम दिया जा रहा है। ध्यान दें कि 00001.jpg जैसी किसी भी पहले से मौजूद फाइल को अधिलेखित कर दिया जाएगा।


यह एक लाइनर स्क्रिप्ट उबंटू और अन्य लिनक्स डिस्ट्रोस पर 'आउट ऑफ बॉक्स' काम करता है!
L

6

एक अजगर स्क्रिप्ट के नीचे।

स्क्रिप्ट अंकों की निर्धारित संख्या तक अग्रणी शून्य जोड़ता है। यदि नाम इससे बड़ा है, तो फ़ाइल (नाम) अछूता है।

एक नाम बदलने की कार्रवाई में अलग-अलग एक्सटेंशन के संयोजन से कुछ सुविधा मिल सकती है। विस्तार (ओं) को जोड़ने के लिए, उदाहरण के लिए, उन्हें टपल में जोड़ें extensions = (".jpg", ".jpeg", ".tiff")

पाठ को एक खाली फ़ाइल में कॉपी करें, इसे इस रूप में सहेजें rename.py, फाइलों के निर्देशिका में सही पथ दर्ज करें ( sourcedir), उन अंकों की संख्या जिन्हें आप नए नाम रखना चाहते हैं ( number_ofdigits) और फ़ाइल एक्सटेंशन (नाम) का नाम बदलना ( extensions)

इसे कमांड द्वारा चलाएं:

python3 /path/to/script/rename.py

लिपी:

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")

files = os.listdir(sourcedir)
for item in files:
    if item.endswith(extensions):
        name = item.split("."); zeros = number_ofdigits-len(name[0])
        newname = str(zeros*"0")+name[0]+"."+name[1]
        shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)

संपादित करें:

थोड़ा बेहतर संस्करण के नीचे। यह स्वचालित रूप से निर्देशिका में सबसे लंबे नाम को निर्धारित करता है, और सबसे लंबे नाम की लंबाई तक अग्रणी शून्य जोड़ता है।

उदाहरण:

1.jpg
12.jpg
123.jpg

हो जाता है:

001.jpg
012.jpg
123.jpg

अंकों की संख्या निर्धारित करने की आवश्यकता नहीं है।

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))

for item in files:
    zeros = maxlen-len(item[2])
    shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])

2

पर्ल में एक नामांकित उपयोगिता लागू की गई है जो इसे बहुत आसान बनाती है:

rename 's/\d+/sprintf("%05d",$&)/e' *.jpg

पहला तर्क एक पर्ल अभिव्यक्ति है जिसका मूल्यांकन प्रत्येक फ़ाइल नाम के लिए किया जाता है।


0

एक GUI है जो इस pyRenamer को करेगा जो रिपॉजिटरी में पाया जा सकता है। इंस्टॉल करें, शुरू करें, अपनी निर्देशिका का चयन करें और 'पैटर्न' टैब पर 'नामांकित फ़ाइल नाम पैटर्न' को '{num5}' पर सेट करें और 'नाम बदलें' बटन पर क्लिक करें। आप यह भी देख सकते हैं कि नाम बदलने से पहले क्या होगा।


जब आपका जवाब काम नहीं करता है, तो कृपया ध्यान दें कि यह एक shell-scriptingअनुभाग है, जिसका अर्थ है कि मैं एक कमांडलाइन उत्तर की तलाश कर रहा हूं। इसके अलावा, क्या आप कार्यक्रम के बारे में अधिक विस्तार प्रदान कर सकते हैं? उदाहरण के लिए, पैटर्न प्रारूप क्या है {num5}?
काज वोल्फ

-4
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`     
do    
  mv $file "000"$file    
done

यह क्रूड है, क्योंकि यह समझदारी से नामकरण नहीं करता है, इसके लिए एक चाल के बारे में सोचना होगा। लेकिन इससे आपको सामान को छाँटने में मदद करनी चाहिए।

अद्यतन: वैसे आपके पास एक अधिक पूर्ण उत्तर है।


2
यह 14014.jpg का नामकरण 0001439.jpg के रूप में करता है।
अविनाश राज

हां, मुझे पता है, बस अतिरिक्त शून्य को गद्देदार करना चाहिए जो अभी भी सॉर्ट के साथ काम करना चाहिए।
स्वर्णेंदु विश्वास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.