फ़ाइलों का नाम बदलने बैच


149

मेरे पास छवियों से भरी एक निर्देशिका है:

image0001.png
image0002.png
image0003.png
...

और मैं उनका (कहना) नाम बदलने के लिए वन-लाइनर चाहूंगा।

0001.png
0002.png
0003.png
...

मैं यह कैसे करु?


8
यह शीर्ष यूनिक्स कमांड लाइन एफएक्यू में से एक है, और मैं इसे पहले से ही इस साइट पर नहीं पा सकता हूं, तो क्या हमें इस समुदाय को विकी बनाना चाहिए?
गिल्स

5
मैं क्यों नहीं देख रहा हूँ। यह एक विशिष्ट प्रश्न का उत्तर देने योग्य है।
इंटरनेट मैन

3
यदि आप X चला रहे हैं तो यह thunar -B *.pngथूनर के थोक-नाम बदलने के लिए आसान नहीं है ।
डॉटजेओ

@dotjoe धन्यवाद, थूनर वास्तव में दिलचस्प है।
वोल्कर सीगल

जवाबों:


105

यदि आप बैश या अन्य POSIX- संगत शेल का उपयोग कर रहे हैं:

for f in *.png; do
    mv -- "$f" "${f#image}"
done

2
यह मेंडल कूपर्स एडवांस्ड बैश-स्क्रिप्टिंग गाइड tldp.org/LDP/abs/html
W_Whalley

2
@W_Whalley मैं दृढ़ता से उस गाइड से बचने की सलाह देता हूं, वुलगे बैश गाइड के पक्ष में ।
वाइल्डकार्ड

@Wildcard: ABS गाइड से बचने के लिए सिफारिश करने के लिए आपके कारण क्या हैं?
क्रिश्चियन सेवेरिन

@ChristianSeverin बुरी प्रथाओं और एकमुश्त टूटे हुए कोड को बढ़ावा देना। मेरे प्रोफ़ाइल पृष्ठ पर लिंक देखें।
वाइल्डकार्ड

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

108

डेबियन और डेरिवेटिव पर, पर्ल renameको sedइस तरह से काम करना पसंद है:

  rename -v 's/image//' *.png

वहाँ भी renameहै util-linuxकि इस तरह से काम करता है, बजाय:

  rename image '' *.png

6
आपको वास्तव में समझाना चाहिए कि यह एक पर्ल प्रोग्राम है जिसे स्थापित करना पड़ सकता है और यह तर्क के रूप में नियमित अभिव्यक्ति लेता है।

आह, मुझे इस बात की जानकारी नहीं थी। जब मैं इसे पहचानता हूं, तो इसका श्रेय कैनोनिकल जवाब को देता हूं। :)
इंटरनेट मैन

5
यह renameकार्यक्रम एक पर्ल उदाहरण वितरण से आया है। डेबियन और उबंटू इसे शिप करते हैं /usr/bin/rename। अन्य यूनिक्स संस्करण इसे प्रदान नहीं कर सकते हैं, या पूरी तरह से अलग प्रदान कर सकते हैं /usr/bin/rename
गिल्स

1
के कुछ संस्करणों renameएक ले से करने के लिए प्रतिस्थापन पैटर्न:rename [options] <expression> <replacement> <file>...
melds

1
यदि आप डेबियन आधारित प्रणाली का उपयोग कर रहे हैं तो sudo apt-get install rename, तो आप नाम बदलें कमांड का उपयोग कर सकते हैं। यह फ़ाइल नाम के लिए sed है।
ctrl-alt-delor-Dec

41

ZMV

Zsh शेल में एक शक्तिशाली बैच का नाम बदलकर कमांड दिया गया है zmv

पहले आपको zmvकमांड को इस प्रकार सक्षम करना होगा (यह आपके में जा सकता है ~/.zshrc)।

autoload zmv

मूल वाक्य रचना है zmv PATTERN REPLACEMENT। पैटर्न एक शेल ग्लोब अभिव्यक्ति है। पैटर्न के हिस्सों को कोष्ठकों से घिरा जा सकता है। प्रतिस्थापन पाठ शामिल कर सकते हैं $1, $2आदि, पैटर्न में वां parenthesised समूह का उल्लेख करने के। उदाहरण के लिए:

zmv 'image(*.png)' '$1'

आप स्वचालित रूप से परिभाषित करने के लिए zsh पूछ सकते हैं $1, $2आदि पैटर्न में वाइल्डकार्ड वर्णों मैच के लिए:

zmv -w 'image*.png' '$1.png'

4
sweeeeeeeeeeeeeeeeeet। अभी तक एक और कारण मैं zsh सीखना चाहिए।
ixtmixilix

1
@ixtmixilix क्या सीखना है? बस इसे इस्तेमाल करना शुरू करें और शायद कुछ अतिरिक्त अजीबता के लिए प्रीज़्टो ( github.com/sorin-ionescu/prezto ) जोड़ें ।
Gerry

वास्तव में अच्छा है, जैसा कि zmv के आदमी में बताया गया है, इसे और भी सरल किया जा सकता है: उपनाम mmv = 'noglob zmv -W': mmv * .c.orig मूल / *। C
Bretsko

सक्षम करने से zmvprezto में लाइन uncommenting की आवश्यकता है अपने ~ / .zpreztorc निम्नलिखित # Set the Zsh functions to load (man zshcontrib).दे रही हैzstyle ':prezto:load' zfunction 'zargs' 'zmv'

33

मैं सामान्य रूप से इस usecase के लिए अच्छे और सरल mmv ( मैन पेज ) उपयोगिता का उपयोग करता हूं :

$ mmv "image*.png" "#1.png"

अपना कार्य करेंगे।

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

उद्धृत करके पैटर्न को शेल से सुरक्षित करना सुनिश्चित करें।


इस उपयोगिता को इंगित करने के लिए धन्यवाद। मैंने इसे डेबियन, उबंटू और सिगविन रिपॉजिटरी में पाया। मुझे मैन पेज से परेशानी थी, लेकिन कुछ वेब पेज और यह स्टैक ओवरफ्लो प्रश्न मिला, जो यह समझाने में मदद करते थे कि आप इसका उपयोग कैसे कर रहे हैं। stackoverflow.com/questions/417916/how-to-do-a-mass-rename
W_Whalley

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

3
यह पर्याप्त नहीं बढ़ा सकते हैं! यह इतना सरल और अनुकूल है। होमब्रे में ओएस एक्स के लिए उपलब्ध है।
ग्रेग डबिकि

9

पाश के लिए पोसिक्स श

नाम बदलने के लिए sed का उपयोग करता है

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done

6

मुझे पर्ल बहुत पसंद है:

perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

आप फ़ाइलों को किसी अन्य निर्देशिका में कॉपी करने जैसे अन्य कार्यों के लिए भी इसी पैटर्न का उपयोग कर सकते हैं:

perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'

2
या (सुरक्षित!):rename($old,$_)
reinierpost

5

qmv

qmvसे कमांड renameutilsएक संपादक को खोलता है जिसमें दो कॉलम्स के साथ फ़ाइलनामों की एक सूची दिखाई जाती है, जिसे एक टैब द्वारा अलग किया जाता है। प्रत्येक पंक्ति, दोनों स्तंभों में एक फ़ाइल नाम के समान दिखाई देती है। सही स्तंभ फ़ाइलों के नए नामों का प्रतिनिधित्व कर रहा है।
परिवर्तन करने के लिए, दाईं ओर के नामों को संपादित करें। इस उदाहरण में, :%s/...या दृश्य ब्लॉक मोड मददगार हैं।

आपके संपादक में नाम

$ qmv *.png

संपादक में:

image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

सही कॉलम में नाम संपादित करें:
( imageविजुअल ब्लॉक मोड का उपयोग करके सभी लाइनों से उपसर्ग को हटाते हुए)

image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

नाम बदलने का नाम:

image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png

(उदाहरण के लिए Ubuntu: apt-get install renameutils)


3

पुनरावर्ती

आसान छवि का चयन * फाइल png, और फ़ाइल नाम में newline से निपटने के लिए कोई ज़रूरत नहीं मानता

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done

सुरक्षित, रिक्त स्थान, नई लाइनों, बैकस्लैश और किसी भी चीज़ से निपट सकते हैं :

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done

1

थोड़ी देर के लूप का उपयोग करके पोसिक्स श

findकमांड से नाम पढ़ना ।

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

एक फ़ाइल से नाम पढ़ना

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist


1

के लिए विंडोज और लिनक्स , इस पर्ल स्क्रिप्ट करना होगा; इस मामले में:

$ rnm -l 's/^image//' '*.png'

स्क्रिप्ट निर्देशिकाओं के तहत पुनरावर्ती चला सकती है और यहां तक ​​कि उन सभी के लिए एक गिनती तैयार कर सकती है:

$ rnm -r 's/^/$counter./' '/\.png$/'

UTF-8 वर्ण भी सही ढंग से इलाज कर रहे हैं, दोनों विंडोज और लिनक्स में।


0

आप इस टूल का उपयोग कर सकते हैं: rnm ( वेब पेज )

आपके मामले के लिए यह आदेश होगा:

rnm -rs '/^image//' *.png

आप यहां अधिक उदाहरण / डॉक्स पा सकते हैं ।


0

नियमित रूप से अभिव्यक्ति (विंडोज, लिनक्स और ओएस एक्स का समर्थन) के माध्यम से फ़ाइलों / निर्देशिकाओं को सुरक्षित रूप से बैच करने के लिए एक व्यावहारिक क्रॉस-प्लेटफ़ॉर्म कमांड-लाइन उपकरण, ब्रेनगेम ( https://github.com/shenwei356/brename ) आज़माएं ।

@patrickDurusau ने कहा:

लिनक्स में विभिन्न प्रकार के बैच फ़ाइल का नाम बदलने के विकल्प हैं, लेकिन मैंने किसी भी शॉर्ट-कॉमिंग को ब्रेन में नहीं देखा, जो मेरे ऊपर कूद गया।

विशेषताएं:

  • क्रॉस-प्लेटफ़ॉर्म । विंडोज, मैक ओएस एक्स और लिनक्स का समर्थन।
  • सुरक्षित हैसंभावित संघर्षों और त्रुटियों की जाँच करके ।
  • फ़ाइल फ़िल्टरिंग । नियमित अभिव्यक्ति के माध्यम से फ़ाइलों को शामिल करना और बाहर करना। जैसे कमांड चलाने की जरूरत नहीं find ./ -name "*.html" -exec CMD
  • कुंजी-मान फ़ाइल के माध्यम से संबंधित मान के साथ नाम बदलना
  • आरोही पूर्णांक के माध्यम से नामकरण
  • दोनों फ़ाइलों और निर्देशिकाओं का पुनः नामकरण
  • शुष्क रन का समर्थन
  • रंगीन उत्पादन

कमान:

$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed

-5

ls * पीएनजी | पढ़ते हुए -rf; do f2 = "` इको $ f | sed -e's / image // '`"; एमवी $ एफ $ एफ 2; किया हुआ


कुछ सही नहीं है: "mv: 'इमेज0001.png' के बाद गायब गंतव्य फ़ाइल ऑपरैंड
इंटरनेट आदमी

3
आपके कोड के साथ कई समस्याएं हैं। के उत्पादन को पार्स करना lsकेवल परेशानी का आह्वान है। readहोना चाहिए read -r। सभी परिवर्तनीय प्रतिस्थापन दोहरे उद्धरण चिह्नों के भीतर होने चाहिए।
गिल्स

आप इसे और अधिक प्रभावी रूप से लिख सकते हैं for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done। पार्स lsकरना न तो आवश्यक है औरही एक अच्छा विचार है
कोजिरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.