एक निर्देशिका में सभी फ़ाइल नामों (उन्हें नाम बदलें) से 1 घटाएँ।


17

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

image1.jpg 
image2.jpg 
image3.jpg
...

दुर्भाग्य से, छवि नाम शून्य आधारित image1.jpgहोना चाहिए , इसलिए होना चाहिए image0.jpg, image2.jpgहोना चाहिए image1.jpgऔर इसी तरह।

मैं इस तरह mv कमांड उत्पन्न करने के लिए एक स्क्रिप्ट लिख सकता हूं , उन्हें एक शेल स्क्रिप्ट में डाल सकता हूं, और फिर उन्हें निष्पादित कर सकता हूं -

mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...

लेकिन मुझे लगता है कि यूनिक्स में ऐसा करने का एक तरीका है। तो यह क्या है?


6
यह वास्तव में ऐसा करने का सबसे सरल तरीका है, जब तक कोई अंतराल न हो। ( for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done)
रिकी बीम

5
क्या छवियों का क्रम महत्वपूर्ण है? यदि नहीं, तो बस अंतिम छवि को फिर से नाम imageN.jpgदें image0.jpgऔर आप कर रहे हैं।
jnovacho

@ जोनोवाचो, काफी चतुर! लेकिन हां, छवियों का क्रम महत्वपूर्ण है।
वेस

जवाबों:


20

अच्छा पुराना पर्ल नाम:

rename 's/(\d+)(\.jpg)/($1-1).$2/e' *

[टिप्पणियों]

छवि संख्या 0 से अधिक होनी चाहिए।

यदि चित्र 9 से अधिक हैं और 0s अग्रणी नहीं हैं, तो $(ls -v1 *)क्लोबरिंग से बचने के लिए उपयोग करें। @Arielf द्वारा प्रस्तावित और @Gememe द्वारा देखा गया।

जब संदेह का उपयोग क्रिया के लिए -vऔर -nबिना क्रिया के भी किया जाता है।


"ई" क्या दर्शाता है?
वेस

3
'ई' का अर्थ है मूल्यांकन, प्रतिस्थापित अनुभाग का मूल्यांकन किया जाएगा। यह भी देखेंperlreref

6
किसी भी क्लोब से बचने के लिए फ़ाइलों को आरोही क्रम में पास किया जाना चाहिए। यह तभी ठीक काम करेगा जब 10 से कम फाइलें हों (या यदि संख्याओं में अग्रणी शून्य हो)।
ग्रीम

मैंने पहले ही इस पर ध्यान दिया, 0सूत्रों में यह भी नहीं होना चाहिए ।

2
के *साथ अंत में बदलें `ls -v1 *`और आप क्लोबरिंग से सुरक्षित रहेंगे। यह सबसे कम संख्या से उच्चतम तक जाएगा।
arielf

6

आप उत्पन्न mvकमांड को पाइप कर सकते हैं bash। इसलिए आपको उन्हें स्क्रिप्ट में कॉपी करने और उस पर अमल करने की जरूरत नहीं है। देख:

command_that_generates_mv_commands | bash

और हर उस चीज को अंजाम दिया जाएगा, जिसे पाइप किया गया है bash


वह भोंडा नहीं है। :)हालाँकि, समस्या को हल करता है, इसलिए +1।
JMCF125

5

आप ls आउटपुट पर iterate कर सकते हैं, यह आपके उदाहरण के लिए काम करता है:

i=0 
for file in $(ls *.jpg | sort) ; do 
     mv $file $(echo $file | sed 's/[0-9]*.jpg$/'${i}'.jpg/')
     i=$((++i))
done

आपको अपनी फ़ाइलों के समान पथ पर होना चाहिए


1
उपयोग करने के लिए -iया इसके -nसाथ बेहतर mv, यह किनारे के मामलों में ओवरराइटिंग को रोक देगा।
ग्रीम

sort -Vइसके बजाय बेहतर नहीं होगा ?
user80551

sortयह काम नहीं करेगा, यह image10.jpgपहले दिखाएगा image1.jpgजो एक मुद्दा हो सकता है। आपको sort -nk 1.8@ ग्रीम के उत्तर की आवश्यकता है।
terdon

@ user80551, sort -Vएक अच्छा विचार है, इसे मेरे उत्तर में जोड़ देगा। हालांकि, अन्य किनारे के मामले हो सकते हैं, आमतौर पर इस तरह के विकल्पों को जोड़ने के लिए अच्छी सलाह इस तरह से होती है जैसे कोई व्यक्ति कॉपी करता है और कुछ नुकसान करता है।
ग्रीम

4

निम्नलिखित किसी भी चीज के लिए काम करता है जो पैटर्न को फिट करता है imageNUMBER.jpg। मैंने कमांड को पहले दिखाने के लिए रखा है echoकि mvकमांड क्या करेगा; वास्तव में नामकरण करने के लिए, बस निकालेंecho

for i in `ls image*.jpg|sort -V` ; do 
    x=`echo $i|sed -e "s/image\(.*\).jpg/\1/"`
    y=$(( $x - 1 ))
    echo mv -i $i image$y.jpg
done

पहली पंक्ति में, ls image*.jpg|sort -VJPG फ़ाइलों को फ़ाइल नाम में आरोही संख्याओं के साथ सूचीबद्ध करने का कारण होगा। x=लाइन फ़ाइल नाम से नंबर निकालता है। y=लाइन तो एक के बाद नंबर decrements। इनपुट फ़ाइल नाम और yसंख्या को तब mvकमांड में उपयोग किया जाता है , जहां -iएक फ़ाइल को अधिलेखित करने से पहले झंडा आपको सूचित करेगा।

मेरे अपने छोटे परीक्षण के लिए, इसने उत्पादन का उत्पादन किया:

mv -i image1.jpg image0.jpg
mv -i image2.jpg image1.jpg
mv -i image123.jpg image122.jpg

व्यक्तिगत रूप से, मैं एक और भिन्न फ़ाइल नाम का नाम बदलने का सुझाव दूंगा, क्योंकि अब जिस क्रम में फाइलों को संसाधित किया जाता है वह एक बड़ा अंतर ला सकता है।


1
उपयोग करने के लिए -iया इसके -nसाथ बेहतर mv, यह किनारे के मामलों में ओवरराइटिंग को रोक देगा।
ग्रीम

बहुत अच्छा सुझाव है, मैं जवाब को संपादित करूंगा
Brm

MacOS में, आपको उपयोग करना चाहिए sort -n, -Vविकल्प मौजूद नहीं है।
विंसेंट सिट

4

perlस्क्रिप्ट का उपयोग करना prename, जिसे डेबियन आधारित डिस्ट्रो पर नाम बदलने के लिए सहानुभूति है, को भी GNU find/ की आवश्यकता है sort। फ़ाइलों को किसी भी ओवरराइटिंग को रोकने के लिए आरोही क्रम में रखा जाता है।

find . -regex '\./image[0-9]+\.jpg' -print0 | sort -zV |
  xargs -0 rename -n 's/(\d+)\.jpg$/@{[$1-1]}.jpg/'

निकालें -nएक बार आप यकीन है कि यह आप क्या चाहते हैं करता है। ऐसा करने से पहले ही मौजूद फ़ाइलों के बारे में चेतावनी देगा। हालाँकि जब तक यह फाइलों को आरोही क्रम में नाम बदला जा रहा है, तब तक असली के लिए चलाने पर कोई संघर्ष नहीं होगा।


फ़ाइल पहले से ही इस एक के साथ मौजूद है।
वेस

4

के साथ zsh:

autoload zmv # (in ~/.zshrc)
zmv -Qf -n 'image(<->).jpg(n)' 'image$(($1-1)).jpg'

(निकालें -nजब खुश)।

(n)सूची को क्रमबद्ध करने के लिए image9.jpgपहले नाम बदल दिया जाता है image10.jpg

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