Como eu altero um caractere incorporado em nomes de arquivos para outro caractere?

0

Em um diretório com vários subdiretórios, preciso alterar os nomes dos arquivos que possuem o caractere _ para outro caractere: . , por exemplo:

ABC12345_DEF --> ABC12345.DEF

Eu preciso fazer isso de forma recursiva por meio de uma árvore de diretórios.
Os últimos três caracteres do nome do arquivo nem sempre são os mesmos.

O uso de curingas renomeados nos dois lados do _ ou . não funciona (além disso, preciso fazer isso por meio de vários diretórios).

    
por PilotMom 08.02.2011 / 06:27

3 respostas

0

O seguinte deve funcionar. Eu usei move em vez de ren devido às peculiaridades de ren ao manipular nomes de arquivos entre aspas.

for /f "tokens=1,2 delims=_" %i in ( 'dir /s/b *_*.' ) do @( move "%i_%j" "%i.%j" )

Você pode remover o @ se quiser acompanhar visualmente o progresso do comando.

    
por 08.02.2011 / 06:57
1

Esse arquivo em lote deve fazer isso por você.

Copie o arquivo de lote abaixo em um arquivo de texto e salve-o como xrename.cmd (ou "whatever you want.cmd").

Se você acabou de executar o arquivo assim:
xrename.cmd

Ele irá procurar na pasta atual e em todas as subpastas e renomear todos os arquivos como: ABC12345_DEF para ABC12345.DEF (qualquer coisa como "text_moretext" para "text.moretext").

Você também pode fornecer valores para "string de pesquisa", "string de substituição" e "padrão de pesquisa" na linha de comando.

Para mostrar instruções, execute-as assim:
xrename.cmd / help

Observação: fiz o arquivo em lote para exibir apenas os arquivos que serão renomeados, sem renomear . Você pode executar o arquivo em lote e ver o que acontecerá sem renomear nada. Depois de executá-lo e ter certeza de que os arquivos corretos serão renomeados corretamente, você poderá excluir a linha conforme descrito abaixo para tornar a renomeação ativa e, em seguida, executar o arquivo em lotes novamente.

Você pode ter que modificar o valor de "padrão de pesquisa" para exibir os arquivos desejados.

Nos rótulos ": default1" e ": default2", você pode editar os valores de "string de correspondência" "padrão de pesquisa" e "string de substituição" para atender às suas necessidades.

Esse arquivo em lote tem alguma verificação de erros e não falhará se a "string de correspondência" for encontrada nos nomes de qualquer uma das pastas ou subpastas.

@echo off

if "%~1%~2%~3."=="." goto :default1
if /i "%~1."=="/help." goto :syntax
if "%~1."=="." goto :syntax

rem %2 can be empty to use "*matchstring*" as the "search-pattern"
rem %3 can be empty to make replacement with empty string (delete matchstring).

set "matchstring=%~1"
set "replacestring=%~3"

if "%~2."=="." goto :default2
set "searchpattern=%~2"
goto :start

:default1
set "matchstring=_"
set "replacestring=."

:default2
set "searchpattern=*%matchstring%*"

:start
set "renamecount=0"
set "errorcount=0"

echo.
for /r %%f in ("%searchpattern%") do call :work "%%~dpf" "%%~nxf"
echo.
if %renamecount% EQU 0 echo No files renamed.
if %renamecount% EQU 1 echo Renamed %renamecount% file.
if %renamecount% GEQ 2 echo Renamed %renamecount% files.

if %errorcount% EQU 1 echo %errorcount% error renaming files.
if %errorcount% GEQ 2 echo %errorcount% errors renaming files.
echo.

goto :cleanexit

:work
set matchedfilepath=%~1
set matchedfilename=%~2

rem You can't do it directly like this:
rem set "newfilename=%matchedfilename:%matchstring%=%replacestring%%"

for /F "usebackq delims=" %%g in ('echo set "newfilename=%%matchedfilename:%matchstring%=%replacestring%%%"') do %%g
echo In path "%matchedfilepath%": Renaming "%matchedfilename%" to "%newfilename%"




rem delete the next line (goto :EOF) to make renaming active
goto :EOF




ren "%matchedfilepath%%matchedfilename%" "%newfilename%"
if %errorlevel% NEQ 0 goto :workerror
if not exist "%matchedfilepath%%newfilename%" goto :workerror
goto :workok

:workerror
echo Rename "%matchedfilepath%%matchedfilename%" failed.
set /A errorcount=errorcount+1
echo.
goto :EOF

:workok
set /A renamecount=renamecount+1
goto :EOF

:syntax
rem:syntax
echo.
echo Syntax:
echo    %~nx0 ["match-string" ["search-pattern"] ["replace-string"]]
echo.
echo    Search for files matching "search-pattern" in current folder and through all 
echo    subfolders.  For each matched file, rename file by replacing "match-string" 
echo    with "replace-string".
echo.
echo    If "replace-string" is empty or not specified, rename file by deleting 
echo    "match-string".
echo.
echo    If "search-pattern" is empty, use "*matchstring*" as the "search-pattern".
echo.
echo    If "match-string" "search-pattern" and "replace-string" are all empty or not 
echo    specified, then defined defaults will be used.
echo.
echo    If "search-pattern" and/or "replace-string" are NOT empty then "match-string" 
echo    cannot be empty, 
echo.
goto :EOF

:cleanexit
set "matchstring="
set "replacestring="
set "searchpattern="
set "renamecount="
set "errorcount="
set "matchedfilepath="
set "matchedfilename="
set "newfilename="
goto :EOF

Depois de executar o arquivo em lotes e ter certeza de que os arquivos corretos serão renomeados corretamente, edite o arquivo para remover a (s) linha (s) descrita (s) para tornar a renomeação ativa e execute o arquivo em lotes novamente.

Para fazer isso, encontre as duas linhas que são assim:

rem delete the next line (goto :EOF) to make renaming active
goto :EOF

Em seguida, remova a linha que diz "goto: EOF" (ou remova as duas linhas).

Não remova "goto: EOF" de qualquer outro lugar no arquivo de lote (ele pode ser encontrado em alguns lugares, portanto, certifique-se de remover o correto).

Se isso não estiver funcionando para você, ou se você quiser que eu explique tudo no arquivo de lote, apenas me avise.

    
por 18.11.2012 / 09:29
0

modificando o que eu achei em este script renomear / mover lote isso deve funcionar:

for /r %x in (*_*) do ren "%x" *.*
    
por 08.02.2011 / 06:45