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

13

我正在使用以下命令重命名空文件扩展名:

rename *. *.bla

然而,我有一个包含数百个这样的子文件夹的文件夹,而这个命令要求我手动导航到每个子文件夹并运行它。

是否有一条命令可以从一个上级文件夹运行,同时包括所有子文件夹中的所有文件?


我认为它也属于这里。 - jrharshath
7个回答

7
for /r c:\path\ %G in (*.) do ren "%G" *.bla

4

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"

给我返回了“不是内部或外部命令”的错误。在命令行测试中使用单个百分号。看起来很接近,但还没有完全实现。 - Glenn
你是将单个 % 同时用于 for 循环和重命名吗? - akf
没错。你这边有什么进展了吗? - Glenn
是的,它运行良好。你能复制/粘贴你正在使用的命令吗? - akf

1

试试这个

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

如果从命令行中发出,这会在当前目录中启动吗?(只是不想意外地泄漏到驱动器的其他部分) - Glenn
是的。如果您需要它在固定目录中,您可以更改括号中的通配符,例如 for /d %x in (%userprofile%\foo*) do ... - Joey

0
使用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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接