【问题标题】:recursive renaming file names + folder names with a batch file使用批处理文件递归重命名文件名+文件夹名
【发布时间】:2013-10-04 16:05:26
【问题描述】:

我喜欢创建一个批处理文件(winxp cmd),它递归地遍历选定的文件夹和子文件夹,并使用以下规则重命名文件+文件夹:

从所有文件+文件夹名称中,所有大写+小写“V”和“W”字母都需要替换为字母“Y”和“Z”。

例如11V0W 必须变成 11Y0Z。

我相信 FOR /R 是可能的,但如何? 我认为除了使用 FOR / R 进行基本递归之外,还需要调用一个子例程来逐个检查每个字母。

【问题讨论】:

    标签: batch-file rename batch-rename


    【解决方案1】:

    以下批次至少对文件名执行此操作。目录有点棘手(至少到目前为止我想不出一个非无限的解决方案):

    @echo off
    setlocal enableextensions
    for /r %%f in (*) do call :process "%%f"
    endlocal
    goto :eof
    
    :process
    pushd "%~dp1"
    set fn=%~nx1
    set fn=%fn:V=Y%
    set fn=%fn:W=Z%
    ren "%~nx1" "%fn%"
    popd
    goto :eof
    

    但从理论上讲,将 dir 重命名到此应该不会太难。

    【讨论】:

      【解决方案2】:

      Tom,我在摆弄我之前发布的一个脚本,这是一个处理所有文件和子目录的脚本:

      recurename.cmd 目录

      @echo off
      setlocal ENABLEDELAYEDEXPANSION
      set Replaces="V=Y" "W=Z" "m=A"
      set StartDir=%~dp1
      call :RenameDirs "%StartDir:~0,-1%"
      exit /b 0
      :RenameDirs
          call :RenameFiles "%~1"
          for /f "delims=" %%d in ('dir /ad /b "%~1"2^>nul') do call :RenameDirs "%~1\%%~d"
          if "%~1"=="%StartDir:~0,-1%" exit /b 0
          set _pos=0
          set _dir=%~f1
          set _dir_orig=!_dir!
          :finddirName
              set /a _pos-=1
              call set _dir_pos=!!!_dir:~%_pos%,1!!!
              if not "%_dir_pos%"=="\" goto finddirName
              call set _origines=!!!_dir:~0,%_pos%!!!
              set /a _pos+=1
              call set _dir=!!!_dir:~%_pos%!!!
          for %%r in (%Replaces%) do call set _dir=!!!_dir:%%~r!!!
          if /i not "!_dir!"=="!_dir_orig!" echo move "%~1" "%_origines%\!_dir!"
          exit /b 0
      :RenameFiles
          for /f "delims=" %%f in ('dir /a-d /b "%~1"2^>nul') do (
              set _file=%%~nf
              set _file_orig=!_file!
              for %%r in (%Replaces%) do call set _file=!!!_file:%%~r!!!
              if /i not "!_file!"=="!_file_orig!" echo ren "%~1\%%f" "%~1\!_file!%%~xf"
          )
          exit /b 0
      

      ___注意事项____
      这是一个非破坏性脚本,请从正确的命令中删除 echo 以重命名任何文件/目录。 (echo moveecho ren)

      Set Replaces=: 将此变量设置为您需要更改的任何对。

      set Startdir=: 我想以某种方式保护论点,并仅从中获取路径。如果将文件作为参数给出,则将处理整个容器目录和子目录。

      if "%~1"=="%StartDir:~0,-1%" exit /b 0: 放置此行是为了停止处理参数目录本身。如果您愿意,请删除此行。
      如果使用 c:\temp\ 调用脚本,则删除此行最终会将名称更改为 c:\teAp\

      【讨论】:

        【解决方案3】:

        使用此目录树:

        .
        ├── 00v0w
        │   ├── 12V0W
        │   ├── 12d0w
        │   └── 12v0d
        ├── 11V0W
        ├── 11d0w
        └── 11v0d
        

        这些renamer 命令:

        $ renamer --regex --find '[vV]' --replace 'Y' '**'
        $ renamer --regex --find '[wW]' --replace 'Z' '**'
        

        会产生这个输出:

        .
        ├── 00Y0Z
        │   ├── 12Y0Z
        │   ├── 12Y0d
        │   └── 12d0Z
        ├── 11Y0Z
        ├── 11Y0d
        └── 11d0Z
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-18
          • 2013-07-13
          • 1970-01-01
          • 1970-01-01
          • 2016-09-11
          • 1970-01-01
          • 2022-08-10
          • 2014-02-02
          相关资源
          最近更新 更多