फ़ाइल नाम के भीतर एक संख्या बढ़ाकर फ़ाइलों का नाम बदलें


14

मेरे पास एक निर्देशिका है जिसमें क्रमांकित छवि फ़ाइलें हैं, कुछ इस तरह से हैं:

01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png

कभी-कभी (जैसे। एक विभिन्न स्वरूपों में एक फ़ाइल के एकाधिक संस्करण हो सकता है pngऔर svgके संस्करण 03और 09इसके बाद के संस्करण फ़ाइलें) लेकिन संख्या अन्यथा लगातार कर रहे हैं। आमतौर पर प्रत्येक निर्देशिका में ऐसी 40-80 फाइलें होती हैं। संख्याएं इन छवियों को पांडुलिपि (एक वर्ड दस्तावेज़, लेकिन यह महत्वपूर्ण नहीं है) के क्रम के अनुरूप हैं। छवियों के क्रम को निर्धारित करने का कोई अन्य तरीका नहीं है।

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

01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png

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

जवाबों:


11

मुझे लगता है कि यह काम करना चाहिए:

#!/bin/bash

NEWFILE=$1

for file in `ls|sort -g -r`
do
    filename=$(basename "$file")
    extension=${filename##*.}
    filename=${filename%.*}

    if [ $filename -ge $NEWFILE ]
    then
        mv "$file" "$(($filename + 1))".$extension
    fi
done

स्क्रिप्ट एक पैरामीटर लेता है - आप नई छवि की संख्या।

पुनश्च। अपनी छवियों की तुलना में एक और निर्देशिका में स्क्रिप्ट रखो। छवियों निर्देशिका में केवल इस तरह से नाम वाली छवियां होनी चाहिए जिनका आपने वर्णन किया है।


यह आशाजनक लग रहा है, मैं अपने लैपटॉप पर वापस आने पर कुछ घंटों में कोशिश करूँगा।
रॉबर्ट

यह केवल तभी काम करेगा जब आपका फ़ाइल नाम नॉन-न्यूमेरिक्स वर्ण द्वारा उपसर्ग न किया गया हो
मेम

@ मीम्स ओपी स्पष्ट रूप से बताता है कि फ़ाइल नाम एक नंबर से शुरू होता है
xhienne

2

यह zsh में आसान होगा, जहां आप उपयोग कर सकते हैं

  • On ग्लोब क्वालीफायर घटते क्रम में तरह मैच के लिए (और nसंख्यात्मक क्रम का उपयोग करने के मामले में फ़ाइल नाम सभी प्रमुख एक ही चौड़ाई के शून्यों की जरूरत नहीं है);
  • (l:WIDTH::FILLER:) पैरामीटर विस्तार झंडा पैड के लिए एक ही चौड़ाई (बड़ी संख्या की चौड़ाई) के लिए सभी नंबरों को।
break=$1   # the position at which you want to insert a file
setopt extended_glob
width=
for x in [0-9]*(nOn); do
  n=${x%%[^0-9]*}
  if ((n < break)); then break; fi
  ((++n))
  [[ -n $width ]] || width=${#n}
  mv $x ${(l:$width::0:)n}${x##${x%%[^0-9]*}}
done

बैश में, यहां एक स्क्रिप्ट है जो फ़ाइलों को मानती है एक निश्चित चौड़ाई में गद्देदार होती है (अन्यथा, स्क्रिप्ट सही फ़ाइलों का नाम नहीं बदलेगी) और पैड को एक निश्चित चौड़ाई (जिसे निर्दिष्ट किया जाना चाहिए)।

break=$1      # the position at which you want to insert a file
width=9999    # the number of digits to pad numbers to
files=([0-9]*)
for ((i=#((${#files}-1)); i>=0; --i)); do
  n=${x%%[^0-9]*}
  x=${files[$i]}
  if ((n < break)); then continue; fi
  n=$((n + 1 + width + 1)); n=${n#1}
  mv -- "${files[$i]}" "$n${x##${x%%[^0-9]*}}"
done

1

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


मुझे नहीं लगता कि यह सटीक मुद्दा है, कि हर बार सभी छवियों को फिर से जा रहा है। मैं सिर्फ एक विशेष बिंदु से छवियों को पुनः प्राप्त करना चाहता हूं।
रॉबर्ट

1

आसान:

touch file`ls file* | wc -l`.ext

आपको मिलेगा:

$ ls file*
file0.ext  file1.ext  file2.ext  file3.ext  file4.ext  file5.ext  file6.ext

मैं 1-9 के लिए अग्रणी शून्य कैसे जोड़ूंगा? यह भी याद रखें कि 03.png और 03.svg दो फाइलें हो सकती हैं।
रॉबटर्क

1

इस सवाल में बहुत ज्यादा दिलचस्पी नहीं है, लेकिन क्या किसी को इस पर रोक लगानी चाहिए, यहां तीन मुद्दे हैं। एक यह है कि सिमेंटिक मानदंडों के आधार पर नाम बदलने के लिए फ़ाइलों का चयन कैसे किया जाता है (रेंज लेक्सिकल नहीं है और वाइल्डकार्ड या यहां तक ​​कि नियमित अभिव्यक्ति द्वारा निर्दिष्ट नहीं किया जा सकता है - ऑटोमेटा सिद्धांत कहता है कि यह एनएफए से अधिक जटिल है)। दूसरा यह है कि इसके एक हिस्से को संशोधित करके नाम कैसे बदला जाए। तीसरा है कि नाम टकराने से कैसे बचा जाए। बैश और कई अन्य भाषाओं में एक स्क्रिप्ट यह विशिष्ट परिवर्तन कर सकती है, लेकिन हम में से अधिकांश को हर बार एक कार्यक्रम लिखना नहीं होता है जब हम फ़ाइलों का एक गुच्छा बदलना चाहते हैं। मेरे (फ्री और ओपन सोर्स) rene.py के साथ आप वही कर सकते हैं जो आप चाहते हैं लेकिन नाम टक्कर की समस्या से बचने के लिए दो इनवोकेशन लेते हैं। प्रथमrene ?.*/#7-80 %?.* Bमौजूदा नामों से बचने के लिए% के उपसर्ग जोड़ते हुए, श्रेणी के सभी नामों को बढ़ाता है। फिर rene %* *उन फ़ाइलों से इस उपसर्ग को हटा देता है जिनके पास यह है। मैं इसका वर्णन https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/ पर करता हूं

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