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

时间:2009-06-22 04:37:17

标签: windows command-line

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

rename *. *.bla

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

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

7 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

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

感谢@Wadih M. Find and rename files with no extension?

答案 2 :(得分: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";
    }
}

答案 3 :(得分:2)

这将允许您在名称中输入带空格的目录。 (注意double%用于批处理文件,对命令行使用单个%。)

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

答案 4 :(得分:1)

试试这个

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

答案 5 :(得分:1)

您可以使用for迭代子目录:

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

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

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

答案 6 :(得分: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"
相关问题