2009-09-08 38 views
61

ठीक से बेवकूफ सवाल के लिए खेद है, लेकिन मैं काफी नौसिखिया हूं। मैं फ़ाइलों को जो इस तरह दिखेगा का भार है:फ़ाइल नाम का नाम बदलें

DET01-ABC-5_50-001.dat 
... 
DET01-ABC-5_50-0025.dat 

और मैं उन्हें इस तरह दिखना चाहते हैं:

DET01-XYZ-5_50-001.dat 
... 
DET01-XYZ-5_50-0025.dat 

मैं यह कैसे कर सकते हैं? मैंने इस मंच से कई चीजों की कोशिश की लेकिन मुझे गलती हो रही है। आपकी मदद के लिए धन्यवाद!

उत्तर

123

वहाँ एक नाम बदलने आदेश के वेरिएंट की एक जोड़ी, आपके मामले में, यह उतना ही आसान के रूप में

rename ABC XYZ *.dat 

आप एक संस्करण है जो एक पर्ल regex लेता है हो सकता है हो सकता है कर रहे हैं;

rename 's/ABC/XYZ/' *.dat 
+0

+1 सबसे आसान तरीका – rangalo

+0

धन्यवाद दस लाख! यह आसान था (यदि आप जानते हैं कि कैसे करें ;-)) –

+2

स्टैक ओवरफ्लो में आपका स्वागत है! –

3

आप का उपयोग करने के लिए कैसे एसईडी http://unixhelp.ed.ac.uk/CGI/man-cgi?sed

और यह भी अपने फ़ाइल प्रविष्टियों के माध्यम से लूप के लिए ताकि आप का उपयोग करने के http://www.cyberciti.biz/faq/bash-for-loop/

आपका आदेश कुछ इस तरह दिखेगा, मेरे पास नहीं है जानने के लिए की आवश्यकता होगी मेरे बगल में एक शब्द है तो मैं जांच नहीं कर सकता

for i in `dir` do mv $i `echo $i | sed '/orig/new/g'` 
1

मैं एसईडी के साथ ऐसा करना पसंद है। आप मामले में:

for x in DET01-*.dat; do 
    echo $x | sed -r 's/DET01-ABC-(.+)\.dat/mv -v "\0" "DET01-XYZ-\1.dat"/' 
done | sh -e 

यह पहली बार "श -e" भाग छोड़ देखने के लिए निष्पादित किया जाएगा सबसे अच्छा है।

+0

शायद मैं कुछ गलत कर रहा हूं, लेकिन यह मेरी फाइलों के लिए कुछ भी नहीं कर रहा है? –

+0

क्या आप "sh -e" के साथ या उसके बिना प्रयास कर रहे हैं? यदि आप इसके बिना कोशिश कर रहे हैं तो ऐसा नहीं माना जाता है। यह सिर्फ प्रिंट करता है कि क्या निष्पादित किया जाएगा ("एमवी-वी ... ..." लाइनें) यह जांचने का मौका है कि सबकुछ ठीक है या नहीं। यदि आप जो देखते हैं उसे पसंद करते हैं तो "sh -e" जोड़ें। – stribika

6

ऐसा कुछ ऐसा करेगा। for लूप को उस फ़ाइल नाम के आधार पर संशोधित करने की आवश्यकता हो सकती है, जिसे आप कैप्चर करना चाहते हैं।

for fspec1 in DET01-ABC-5_50-*.dat ; do 
    fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/') 
    mv ${fspec1} ${fspec2} 
done 

तुम हमेशा, प्रतियां अपने डेटा के पर ये स्क्रिप्ट का परीक्षण करना चाहिए जिस तरह से है, और पूरी तरह से अलग निर्देशिका में।

+0

जैसी फ़ाइलों के लिए 's/ABC */XYZ /' 'regex के रूप में उपयोग करना पड़ा। नाम बदलता अच्छा लगता है, लेकिन नाम का एक ब्रू इंस्टॉल एक पर्ल स्क्रिप्ट स्थापित करना प्रतीत होता है जो ऊपर दिए गए उदाहरण के अनुसार काम नहीं करता है। कुछ googling संकेत दिया कि नाम सभी लिनक्स वर्रों पर उपलब्ध नहीं है और वास्तव में एक perl संस्करण के बारे में तैर रहा है। मुझे मतभेदों को सुलझाने और निर्णय लेने में लगभग 10 मिनट लग गए - आपको पता है कि यह जवाब बस इतना आसान है :)। – j03m

1

ये सभी उत्तर सरल और अच्छे हैं। हालांकि, मैं हमेशा इन स्क्रिप्ट्स पर एक इंटरैक्टिव मोड जोड़ना चाहता हूं ताकि मुझे झूठी सकारात्मक मिल सके।

अगर [[-n $ inInteractiveMode]]
तो
    गूंज -e -n "$ oldFileName => $ newFileName \ n क्या आप इस परिवर्तन करना चाहते हैं [हां/नहीं]:?"
    पढ़ने चलाने

    [[-z $ रन || "$ रन" == "वाई" || "$ रन" == "Y"]] & & mv "$ oldFileName" "$ newFileName"
फाई

या इंटरैक्टिव मोड डिफ़ॉल्ट बनाने के लिए और एक शक्ति फ्लैग जोड़ने (-f | --force) स्वचालित स्क्रिप्ट के लिए या यदि आप साहसी महसूस कर रहे हैं। और यह आपको बहुत धीमा नहीं करता है: डिफ़ॉल्ट प्रतिक्रिया "हाँ, मैं नाम बदलना चाहता हूं" ताकि आप प्रत्येक प्रॉम्प्ट पर एंटर कुंजी दबा सकें (`` -z $ रन \ परीक्षण की वजह से।

77
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done 

नहीं rename या sed की जरूरत है। बस parameter expansion बाश करें।

+5

यदि फ़ाइल नामों में स्थान हो रहा है, तो आपको उद्धरण का उपयोग करना चाहिए। नीचे * स्नैपेट देखें ... * * .dat में फ़ाइल के लिए; एमवी "$ फ़ाइल" "$ {फ़ाइल // एबीसी/एक्सवाईजेड}" करें; किया गया ' –

+0

ओएसएक्स पर अच्छा काम करता है –

संबंधित मुद्दे