【问题标题】:Batch rename file extensions, including subdirectories批量重命名文件扩展名,包括子目录
【发布时间】:2010-11-04 18:11:45
【问题描述】:

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

rename *. *.bla

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

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

【问题讨论】:

  • /我觉得它也属于这里

标签: windows command-line


【解决方案1】:
for /r c:\path\ %G in (*.) do ren "%G" *.bla

【讨论】:

    【解决方案2】:
    @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?

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 给我不识别为内部或外部命令错误。使用单个 % 进行命令行测试。看起来很接近,但还没有完全做到。
      • 您在 for 循环和重命名中都使用了单个 %?
      • 正确。你的运气好吗?
      • 是的,它工作正常。你能复制/粘贴你正在使用的命令吗?
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

        • 如果从命令行发出,它会从当前目录开始吗? (只是不想意外溢出到驱动器的其余部分)
        • 是的。如果您需要它位于固定目录中,可以将括号中的通配符更改为 for /d %x in (%userprofile%\foo*) do ...
        【解决方案6】:

        试试这个

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-01-23
            • 2015-12-12
            • 2011-02-25
            • 2013-07-13
            • 2022-01-15
            • 1970-01-01
            • 1970-01-01
            • 2019-07-05
            相关资源
            最近更新 更多