2013-02-15 52 views
47

मेरे पास एक एक्सटेंशन (.txt इस मामले में) के साथ फाइलों से भरा निर्देशिका है जिसे मैं स्वचालित रूप से किसी अन्य एक्सटेंशन (.md) में परिवर्तित करना चाहता हूं।निर्देशिका में सभी फ़ाइलों के लिए फ़ाइल एक्सटेंशन बदलना ओएसएक्स

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

या मुझे रेगेक्स के साथ एक स्क्रिप्ट लिखने की ज़रूरत है?

उत्तर

101

आप कुछ इस तरह इस्तेमाल कर सकते हैं:

for old in *.txt; do mv $old `basename $old .txt`.md; done 

पहले एक कॉपी बनाएं!

+0

हाँ ऐसा लगता है। धन्यवाद –

+4

मैवरिक्स पर, यह मेरे लिए काम नहीं करता है, यह आउटपुट देता है: उपयोग: एमवी [-एफ | -ई | -एन] [-v] स्रोत लक्ष्य एमवी [-एफ | -ई | -एन] [-v] स्रोत ... निर्देशिका –

+1

बस मैवरिक्स पर कोशिश की, और यह ठीक काम करता है। यह मानता है कि आप बैश, डिफ़ॉल्ट खोल का उपयोग कर रहे हैं। –

0
cd $YOUR_DIR 
    ls *.txt > abc 
    mkdir target // say i want to move it to another directory target in this case 
    while read line 
    do 
    file=$(echo $line |awk -F. '{ print $1 }') 
    cp $line target/$file.md // depends if u want to move(mv) or copy(cp) 
    done < abc 
35

टर्मिनल इसके लिए आवश्यक नहीं है ... बस उन सभी फ़ाइलों को हाइलाइट करें जिन्हें आप पुनर्नामित करना चाहते हैं। राइट क्लिक करें और "## आइटम का नाम बदलें" चुनें और बस "ढूंढें:" बॉक्स में ".txt" टाइप करें और ".md" को "इसके साथ बदलें:" बॉक्स में टाइप करें।

+0

इस बारे में कभी नहीं पता था - धन्यवाद! –

+1

हाँ। यह बहुत अच्छा था। टर्मिनल में: 'खोलें' और फिर यह करें! बहुत आसान। –

+1

वाह !! इस बारे में कभी नहीं पता था! – n13

42

वैकल्पिक रूप से, आप ren (नाम बदलने) उपयोगिता

brew install ren 

ren '*.txt' '#1.md' 

स्थापित कर सकता है आप फ़ाइल नामों में उपसर्ग या प्रत्यय के साथ फ़ाइलों का नाम बदलना

ren 'prefix_*.txt' 'prefix_#1.md' 
+3

फाइलों के कमांड लाइन नामकरण के लिए यह सबसे अच्छा सुझाव है। धन्यवाद! – Emmanuel

+1

यदि आप फ़ाइल नामों में उपसर्ग या प्रत्यय वाली फ़ाइलों का नाम बदलना चाहते हैं, तो आप 'ren' उपसर्ग _ *। Txt '' prefix_ # 1.md'' – Raptor

+0

धन्यवाद @ रैप्टर, अपडेट कर सकते हैं! – Renaud

4

चयनित और सबसे सटीक उत्तर के आधार पर चाहते हैं उपर्युक्त, पुन: प्रयोज्यता के लिए यहां एक बैश फ़ंक्शन है:

function change_all_extensions() { 
    for old in *."$1"; do mv $old `basename $old ."$1"`."$2"; done 
} 

उपयोग:

$ change_all_extensions txt md 

2

वरीय यूनिक्स तरीका यह है (। मैं समझ नहीं सकता कैसे साफ कोड है कि इसका जवाब पर एक टिप्पणी में स्वरूपण प्राप्त करने के लिए) (हाँ, ओएस एक्स पर आधारित है यूनिक्स) है:

ls | sed 's/^\(.*\)\.txt$/mv "\1.txt" "\1.md"/' | sh

for साथ क्यों पाशन अगर ls डिजाइन द्वारा फ़ाइल नाम की पूरी सूची के माध्यम से लूप? आपके पास पाइप हैं, उनका इस्तेमाल करें। आप न केवल आदेशों का उपयोग करके आउटपुट बना सकते हैं/संशोधित कर सकते हैं, बल्कि कमांड (दाएं, यह कमांड द्वारा बनाए गए कमांड हैं, जो यूनिक्स के आविष्कारकों में से एक ब्रायन कर्निघान है, जो यूनिक्स पर सबसे अधिक पसंद करता है), तो चलिए देखते हैं कि क्या ls और sedsh के पाइप को हटाने के द्वारा पैदा करता है:

$ ls | sed 's/^\(.*\)\.txt$/mv "\1.txt" "\1.md"/' 
mv "firstfile.txt" "firstfile.md" 
mv "second file.txt" "second file.md" 
$ 

आप देख सकते हैं, यह न केवल एक एक लाइनर, लेकिन एक पूरी स्क्रिप्ट है, जो इसके अलावा आउटपुट के रूप में एक और स्क्रिप्ट बनाकर काम करता है। तो आइए बस एक लाइनर स्क्रिप्ट द्वारा उत्पादित स्क्रिप्ट को sh पर फ़ीड करें, जो ओएस एक्स के स्क्रिप्ट दुभाषिया है। बेशक यह रिक्त स्थान के साथ फ़ाइल नामों के लिए भी काम करता है।

Btw: हर बार जब आप टर्मिनल में कुछ लिखते हैं तो आप एक स्क्रिप्ट बनाने, भले ही वह एक यूनिक्स शेल में एक शब्द ls या date आदि सब कुछ चल रहा है की तरह साथ केवल एक ही आदेश है हमेशा एक स्क्रिप्ट/कार्यक्रम है, जो केवल कुछ ASCII- आधारित धारा है (इस मामले में एक डेटा स्ट्रीम के विपरीत एक निर्देश धारा)।

देखने के लिए वास्तविक आदेशों sh द्वारा निष्पादित किया जा रहा है, बस जो खोल में उत्पादन डिबगिंग चालू हो जाती है sh के बाद एक -x विकल्प, जोड़ने के लिए, ताकि आप हर mv आदेश वास्तविक बहस sed संपादक स्क्रिप्ट द्वारा पारित के साथ निष्पादित किया जा रहा देखेंगे (हाँ, लिपि के अंदर एक और लिपि :-))।

हालांकि, यदि आपको जटिलता पसंद है, तो आप awk का भी उपयोग कर सकते हैं और यदि आप केवल मूल कार्य करने के लिए अन्य प्रोग्राम इंस्टॉल करना चाहते हैं, तो ren है। मैं उन लोगों को भी जानता हूं जो इस साधारण हर दिन के कार्य के लिए 50-लाइनें या perl स्क्रिप्ट लिखना पसंद करेंगे।

शायद खोजक को फाइलों का नाम बदलने में आसान है, लेकिन यदि मैक से दूरस्थ रूप से कनेक्ट किया गया है (उदाहरण के लिए ssh के माध्यम से), खोजक का उपयोग करना बिल्कुल संभव नहीं है। यही कारण है कि cmd लाइन अभी भी बहुत उपयोगी है।

+0

यह अच्छी तरह से काम करता है - इसे दोबारा करने के लिए, 'ls' को 'ढूंढें' में बदलें।-नाम "* .txt" ' –

1

यह सिर्फ इस आदेश

find ./ -name "*.txt" | xargs -I '{}' basename '{}' | sed 's/\.txt//' | xargs -I '{}' mv '{}.txt' '{}.md' 
1

मैं एक ऐसी ही समस्या जहां फाइलों अंत में .gifx.gif में नामित किया गया था मारा और उन्हें इस OS X में काम पिछले .gif को दूर करने के लिए एक स्क्रिप्ट लिखने के लिए कोई ज़रूरत नहीं:

for old in *.gifx.gif; do 
    mv $(echo "$old") $(echo "$old" | sed 's/x.gif//'); 
done 
+0

यह आपके इरादे से कुछ और फ़ाइलों को संशोधित करेगा यदि उनके पास नाम में कहीं भी' x? gif' है (उदाहरण के लिए, 'maxsgift.gitx.git')। यह सबसे अच्छा है: 'sed s/\। Gif $ //' '। – giusti

0

आप में से उन लोगों के लिए जो प्रोग्रामिंग में वास्तव में अच्छे नहीं हैं, आप इस लेख को wiki how पर देख सकते हैं।
यह ऐसा करने की कई विधियों को दिखाता है जिसमें
कोडिंग शामिल नहीं है और आप इस ब्लॉगपोस्ट को changing file extensions पर भी देख सकते हैं।
इसमें एक कंसोल एप्लिकेशन है जो आपके लिए सभी सामान करता है।