批量重命名文件扩展名,包括子目录(Batch rename file extensions, inc

2019-07-29 02:23发布

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

rename *. *.bla

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

有没有办法,我可以从只有一个上级文件夹,其中将包括子文件夹中的所有文件运行命令?

Answer 1:

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


Answer 2:

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

由于@Wadih M. 查找和不带扩展名重命名文件?



Answer 3:

这将让你与在名称中使用空格输入迪尔斯。 (注意双%为批处理文件,使用单个%的命令行。)

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


Answer 4:

您可以轻松地做到这一点,很多事情与Perl模块, 文件::查找 。

#!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";
    }
}


Answer 5:

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

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

当使用它从一个批处理文件,您将需要双%标志:

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


Answer 6:

试试这个

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


Answer 7:

使用find和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

然后,你可以调用,为每个文件符合您的标准,包括find命令递归搜索文件夹

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

更常见的样本

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


文章来源: Batch rename file extensions, including subdirectories