बैश स्क्रिप्टिंग का उपयोग करके फ़ाइलों का नाम बदलें


27

मैं बैश स्क्रिप्टिंग का उपयोग करके एक ही निर्देशिका में कई फ़ाइलों का नाम बदलना चाहता हूं। फ़ाइलों के नाम इस प्रकार हैं:

file2602201409853.p
file0901201437404.p  
file0901201438761.p  
file1003201410069.p  
file2602201410180.p

मैं निम्नलिखित प्रारूप का नाम बदलना चाहता हूं:

file2503201409853.p
file2503201437404.p  
file2503201438761.p  
file2503201410069.p  
file2503201410180.p

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

for file in cmpsms*2014*.p; do
    mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}"
done

लेकिन मैं फ़ाइलों का नाम नहीं बदल सकता। मैं क्या गलत कर रहा हूं?



2
आपके पास पैरामीटर विस्तार प्रतिस्थापन अभिव्यक्ति के दाहिने हाथ की तरफ एक पैटर्न अभिव्यक्ति नहीं हो सकती है। आप कहाँ होने की उम्मीद करते थे *?
कोजिरो

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

2
अगली बार, कृपया उस फ़ाइल नाम परिवर्तन का वर्णन करें जिसे आप बनाना चाहते हैं (अंतर और समानताएँ देखने से पहले मुझे इसे निष्पक्ष रूप से देखना था)। उदाहरण अच्छे हैं, लेकिन एक विवरण और उदाहरण भी बेहतर है।
बजे एक CVn

जवाबों:


42

पहले नाम बदलने पर विचार करने के लिए आप सही थे। वाक्यविन्यास थोड़ा अजीब है अगर आप regexes के लिए उपयोग नहीं कर रहे हैं, लेकिन जब तक आप जानते हैं कि आप क्या कर रहे हैं, तो यह सबसे तेज / सबसे छोटा मार्ग है।

rename 's/\d{4}/2503/' file*

यह केवल पहले 4 नंबरों से मेल खाता है और उन्हें आपके द्वारा निर्दिष्ट के लिए स्वैप करता है।

और आपके फ़ाइलनामों का उपयोग करके एक परीक्षण दोहन ( -vnक्रिया का अर्थ है, लेकिन कुछ भी न करें )

$ rename 's/\d{4}/2503/' file* -vn
file0901201437404.p renamed as file2503201437404.p
file0901201438761.p renamed as file2503201438761.p
file1003201410069.p renamed as file2503201410069.p
file2602201409853.p renamed as file2503201409853.p
file2602201410180.p renamed as file2503201410180.p

8
ध्यान दें कि यह डेबियन और डेरिवेटिव (उबंटू, मिंट,…) पर पर्ल का नाम है। अन्य लिनक्स वितरण पर, renameएक पूरी तरह से अलग फ़ाइल नाम बदलने का उपकरण है (जो डेबियन जहाजों के रूप में है rename.ul)।
गाइल्स का एसओ- बुराई को रोकना '

यदि आपके उपकरण में वितरण की कमी है, तो @Michael कैंपबेल जवाब देखें। मुझे लगता है कि renameडिबियन की तरह हर डिस्ट्रीब्यूटिव डिफॉल्ट डिफॉल्ट करता है।
10

25

यह काम कर जाना चाहिए:

for f in file*; do mv $f ${f/${f:4:8}/25032014}; done

यह "25032014" के साथ स्ट्रिंग को 4 वें और 12 वें चरित्र को बदल देता है।


यह for f in file*; do mv $f ${f/${f:4:4}/2503}; doneभी काम करता है।
अविनाश राज

यह अच्छा है। यदि आप केवल शब्द प्रतिस्थापन के लिए एक नियमित शब्द करना चाहते हैं, तो यह सेड की तरह काम करता है। जैसेfor f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
एरिक

1
@ ईरिक - मैंने आपके उत्तर को एक विकल्प के रूप में पोस्ट किया क्योंकि मुझे लगता है कि यह अधिक स्पष्ट और सुरुचिपूर्ण है। यदि आप भी इसे उत्तर के रूप में पोस्ट करना चाहते हैं - तो मैं इसे हटा दूंगा। धन्यवाद!
येहसेफ


यह मुझे एक त्रुटि देता है: "mv: लक्ष्य 'FILE_NAME' एक निर्देशिका नहीं है"
ऑब्रे

10

यह वास्तव में @ एरिक के ऊपर से जवाब है - लेकिन यह एक सुंदर जवाब है इसलिए मैं इसे एक और अधिक ध्यान आकर्षित करने के लिए एक उचित उत्तर के रूप में दोहरा रहा हूं।

for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done

1
ptrn='file[0-9][0-9][0-9][0-9]2014[0-9][0-9][0-9][0-9][0-9].p'
path=/dir
( set -- "${path}/"${ptrn} ; for f ; do {
    echo "mv ${path}/${f} \
        ${path}/file25032014${f#2014}" 
} ; done )

यह काम कर जाना चाहिए। नोट - मैं मास एमवी कमांड सौंपने की आदत में नहीं हूँ - जैसा कि लिखा गया है कि यह सिर्फ एक प्रतिध्वनि है। काम करने से पहले आपको इसे सुलझाना होगा।


1

एक सरल देशी तरीका है बिना लूपिंग के, निर्देशिका ट्रैवर्सल के साथ :

find -type f | xargs -I {} mv {} {}.txt

यह हर फ़ाइल का नाम बदल देगा।

और समानांतर के साथ एक कार्य उदाहरण के नीचे :

find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}2503${f:8}'

बेहतर समाधान की कल्पना करना पहला आसान तरीका था। यदि आप एक काम कमांड करना चाहते हैं:
dtrckd

find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'
dtrckd

0

यदि आप पाते हैं कि आप इस तरह की चीज़ करते हैं, तो "rename.pl" देखें। यह एक पर्ल स्क्रिप्ट है, लेकिन आपको इसे केवल पर्ल कोड (जैसे /// एक्सप्रेशन) के रूप में फीड करने की अनुमति देता है, और यह उस एक्सप्रेशन या कोड के आधार पर मास रीनेम करेगा।

यहां एक मूल संस्करण है: http://stackoverflow.org/wiki/Rename.pl लेकिन नेट के आसपास अन्य संस्करण तैर रहे हैं। यह उम्र और उम्र और उम्र के आसपास है।

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