bash - कैसे बाश में फ़ाइल नामों में पैड नंबर शून्य?




rename (5)

फॉर्म में फाइलों का नाम बदलने के लिए, बैश का उपयोग करने का सर्वोत्तम तरीका क्या है:

(foo1, foo2, ..., foo1300, ..., fooN)

शून्य-गद्देदार फ़ाइल नामों के साथ:

(foo00001, foo00002, ..., foo01300, ..., fooN)

यदि N एक प्राथमिकता तय नहीं है:

 for f in foo[0-9]*; do mv $f `printf foo%05d ${f#foo}`; done

यह एक त्वरित समाधान है जो एक निश्चित लंबाई उपसर्ग (आपके "foo") और निश्चित लंबाई पैडिंग मानता है। यदि आपको अधिक लचीलेपन की आवश्यकता है, तो शायद यह कम से कम एक उपयोगी शुरुआती बिंदु होगा।

#!/bin/bash

# some test data
files="foo1
foo2
foo100
foo200
foo9999"

for f in $files; do
    prefix=`echo "$f" | cut -c 1-3`        # chars 1-3 = "foo"
    number=`echo "$f" | cut -c 4-`         # chars 4-end = the number
    printf "%s%04d\n" "$prefix" "$number"
done

मेरे पास एक और जटिल मामला था, जहां फ़ाइल नामों के साथ-साथ एक उपसर्ग भी था, और मुझे फ़ाइल नाम से संख्या पर घटाव करने की भी आवश्यकता थी। तो मैं foo00000055.png बनने के लिए foo56.png चाहता था मुझे आशा है कि यह आपकी मदद करता है अगर आप कुछ और जटिल कर रहे हैं

#!/bin/bash
for file in foo[0-9]*.png; do
  # strip the prefix ("foo") off the file name
  postfile=${file#foo}
  # strip the postfix (".png") off the file name
  number=${postfile%.png}
  # subtract 1 from the resulting number
  i=$((number-1))
  # copy to a new name in a new folder
  cp ${file} ../newframes/$(printf foo%08d.png $i)
done

यह शुद्ध bash नहीं है, लेकिन rename आदेश के साथ बहुत आसान है:

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

जिस लाइन लाइन का मैं उपयोग करता हूं वह यह है:

ls * | cat -n | while read i f; do mv "$f" `printf "PATTERN" "$i"`; done

PATTERN उदाहरण के लिए हो सकता है:

  • वेतन वृद्धि काउंटर के साथ नाम बदलें: %04d.${f#*.} (मूल फ़ाइल एक्सटेंशन रखें)
  • उपसर्ग के साथ वेतन वृद्धि काउंटर के साथ नाम बदलें: photo_%04d.${f#*.} (मूल एक्सटेंशन रखें)
  • वेतन वृद्धि काउंटर के साथ नाम बदलें और jpg को एक्सटेंशन बदलें: %04d.jpg
  • उपसर्ग और फ़ाइल बेसनेम के साथ वेतन वृद्धि काउंटर के साथ नाम बदलें: photo_$(basename $f .${f#*.})_%04d.${f#*.}
  • ...

उदाहरण के लिए आप फ़ाइल का नाम बदलने के लिए फ़िल्टर कर सकते हैं ls *.jpg | ... ls *.jpg | ...

आपके पास वेरिएबल f उपलब्ध है जो कि फ़ाइल का नाम है और i यह काउंटर है।

आपके प्रश्न के लिए सही आदेश है:

ls * | cat -n | while read i f; do mv "$f" `printf "foo%d05" "$i"`; done




rename