批量重命名文件扩展名,包括子目录

我正在用这个命令重命名空文件扩展名:

rename *. *.bla 

但是,我有一个数百个这样的子文件夹的文件夹,这个命令需要我手动导航到每个子文件夹并运行它。

是否有一个命令,我可以从一个上层文件夹,将包括子文件夹中的所有文件运行?

Solutions Collecting From Web of "批量重命名文件扩展名,包括子目录"

 for /rc:\path\ %G in (*.) do ren "%G" *.bla 
 @echo off for /f "tokens=* delims= " %%i in ('dir /b/s/A-d') DO ( if "%%~xi" == "" rename "%%~fi" "%%~ni.bla" ) 

谢谢@Wadih M. 查找和重命名没有扩展名的文件?

这将允许您输入名称中带有空格的dirs。 (注意,double%是批处理文件,命令行使用一个%。)

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

你可以用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"; } } 

你可以使用for遍历子目录:

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

从批处理文件中使用它时,您需要将%符号加倍:

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

使用find和xargs和basename会使表达式更易于阅读

准备一个像这样的重命名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 

然后你可以调用这个文件来匹配你的条件,包括find命令的递归文件夹搜索

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

更常见的样本

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

尝试这个

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