2009-06-22 11 views
13

मैं इस आदेश के साथ खाली फ़ाइल एक्सटेंशन का नाम बदलने हूँ जिनमें शामिल हैं:बैच नाम बदलने फ़ाइल एक्सटेंशन, उपनिर्देशिकाएं

rename *. *.bla 

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

वहाँ एक आदेश है कि मुझे लगता है कि सब-फ़ोल्डर में सभी फ़ाइलों को शामिल करेगा सिर्फ एक ऊपरी स्तर फ़ोल्डर से चला सकते हैं है?

+0

serverfault –

+0

पर अंतर्गत आता है/मुझे इसे यहाँ भी संबंध रखता है – jrharshath

उत्तर

2

आप आसानी से पर्ल मॉड्यूल File::Find के साथ इस और कई और अधिक कर सकते हैं।

#!perl 

use strict; 
use warnings; 
use File::Find; 

my $extension = 'bla'; 
my $directory = '/tmp/test'; 

print "Files renamed:\n"; 
find(\&wanted, $directory); 

sub wanted { 
    return if /\./; 
    return unless -f $File::Find::name; 

    if (rename($File::Find::name, "$File::Find::name.$extension")) { 
     print " $File::Find::name -> $File::Find::name.$extension\n"; 
    } 
    else { 
     print " Error: $! - $File::Find::name\n"; 
    } 
} 
2

इससे आपको नामों में रिक्त स्थान के साथ डीआईआर दर्ज करने की अनुमति मिल जाएगी। (ध्यान दें डबल% बैच फ़ाइलों के लिए है, कमांड लाइन के लिए एक एकल% का उपयोग करें।)

for /f "tokens=* delims= " %%a in ('dir /b /ad /s') do rename "%%a\*." "*.bla" 
+0

मुझे देते हुए लगता है कि आंतरिक या बाह्य आदेश त्रुटि के रूप में नहीं पहचानता है । कमांड लाइन परीक्षण के लिए एकल% का उपयोग करना। बहुत करीब लगता है, लेकिन यह सिर्फ यह नहीं कर रहा है। – Alan

+0

आप एकल% उपयोग कर रहे हैं के लिए दोनों पाश के लिए और नाम बदलने? – akf

+0

सही। आपके अंत में कोई भाग्य? – Alan

0

इस

for /R c:\temp %I in (*.) DO Echo rename %I "%~nI.bla" 
1

आप for उपयोग कर सकते हैं उपनिर्देशिका से अधिक पुनरावृति करने के लिए प्रयास करें:

for /d %x in (*) do pushd %x & ren *. *.bla & popd 

:

जब एक बैच फ़ाइल से इसे का उपयोग आप % संकेत दोगुना करने की आवश्यकता होगी

+0

तो क्या यह कमांड लाइन से जारी होने पर वर्तमान निर्देशिका में शुरू होगा? (बस गलती से ड्राइव के शेष भागों में गिर नहीं करना चाहते हैं) – Alan

+0

हां। यदि आपको इसे एक निश्चित निर्देशिका में होने की आवश्यकता है, तो आप वाइल्डकार्ड को कोष्ठक में कुछ/जैसे% d (% userprofile% \ foo \ *) में बदल सकते हैं ... – Joey

0

खोजने के लिए और xargs और basename पढ़ने के लिए

(इस तरह एक नाम बदलने खोल स्क्रिप्ट से अधिक फ़ाइलों को संभालने के लिए सही किया तैयार अभिव्यक्ति को आसान बनाने के हैं का उपयोग करना)

#!/bin/sh 
if [ $# -lt 3 ] 
then 
    echo "usage: rename.sh sufold sufnew file1 (file2 file3 ...) " 
    exit 
fi 

sufold=$1 
sufnew=$2 
shift 
shift 

for f in $* 
do 
    echo "to mv " $f `dirname $f`"/"`basename $f $sufold`$sufnew 
    mv $f `dirname $f`"/"`basename $f $sufold`$sufnew 
done 

फिर आप प्रत्येक फ़ाइल मैक में इसका आह्वान कर सकते हैं घ खोजने आदेश

find . -name "*." | xargs rename.sh "." ".bla" 

एक अधिक सामान्य नमूना द्वारा पुनरावर्ती फ़ोल्डर खोज सहित आपके मानदंड,

find . -name "*.htm" | xargs rename.sh ".htm" ".html" 
संबंधित मुद्दे