2009-06-22 164 views
13

我重命名爲空文件擴展名使用此命令:批量重命名文件擴展名,包括子目錄

rename *. *.bla 

不過,我有幾百個這樣的子文件夾的文件夾,此命令需要我手動導航到每個子文件夾並運行它。

有沒有辦法,我可以從只有一個上級文件夾,其中將包括子文件夾中的所有文件運行命令?

+0

屬於對serverfault – 2009-06-22 04:38:29

+0

/我覺得它屬於這裏太 – jrharshath 2009-06-22 04:49:14

回答

2

您可以輕鬆地做到這一點,很多事情與Perl模塊,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 2009-06-22 04:54:36

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 

當使用它從一個批處理文件,你需要的%跡象翻番:

for /d %%x in (*) do pushd %%x & ren *. *.bla & popd 
7
for /r c:\path\ %G in (*.) do ren "%G" *.bla 
0

使用查找和xargs的基本名稱,並會使表達式更容易閱讀

準備這樣一個重命名的shell腳本(校正處理多個文件)

#!/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 

然後你可以調用它到每個文件匹配d您的條件,包括find命令

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

更常見的樣本遞歸文件夾搜索

find . -name "*.htm" | xargs rename.sh ".htm" ".html"