Arquivo em lote para substituir "." com "-"

Arquivo em lote para substituir "." com "-"

Preciso preservar as extensões dos arquivos e isso precisa funcionar nas subpastas.

Por exemplo: "File.name.ext" deve se tornar "File-name.ext"

Eu sou completamente ignorante em relação ao shell script, então seja detalhado em sua resposta. Não tenho ideia do que significa qualquer uma das opções ou mesmo como especificar o caminho.

Responder1

Concordo plenamente com a outra resposta, na verdade. Um utilitário renomeador em massa de GUI seriaentãomuito mais fácil de usar. No entanto, apenas por diversão, escrevi o seguinte arquivo em lote que deve renomear recursivamente todos os arquivos no diretório atual. e subdiretórios. e substitua. com - (por exemplo "Arquivo longo. .nome.ext" se tornará "Longo -arquivo- -nome.ext"):

@echo off
setlocal enabledelayedexpansion
for /r %%f in (*.*) do (
    set fn=%%~nf

    REM Remove the echo from the following line to perform the actual renaming!
    if not [!fn!]==[] if not ["%%~nxf"]==["!fn:.=-!%%~xf"] echo ren "%%~f" "!fn:.=-!%%~xf"
)
pause

Execute o arquivo em lote uma vez e, se a saída parecer satisfatória, execute a renomeação real removendo a palavra echo(segunda instância, não da primeira linha) e executando novamente o arquivo.

Responder2

De alguma forma, não consigo entender por que você quer se preocupar com um arquivo em lote. Por que você não usa uma das inúmeras ferramentas de renomeação de GUI, como:

http://www.beroux.com/english/softwares/renameit/

Se aquele em particular não faz seu barco flutuar, dê uma olhada neste desfile:

http://www.techsupportalert.com/best-free-rename-utility.htm

Responder3

Aqui está minha versão final testada de um arquivo em lote que pode fazer o que você quiser. Funciona com arquivos com e sem nomes de arquivos ou extensões, porém arquivos com nomes de arquivos contendo %ou!causar problemas.

Ele usa expansão atrasada, então você deve executá-lo a partir de um prompt de comando com a expansão atrasada ativada (simplesmente executar setlocal /enabledelayedexpansionnão vai funcionar porque isso apenas alternase já estiver ativado; não terá efeito se não estiver ativado quando o prompt de comando for executado).

Você pode ativar a expansão atrasada abrindo o prompt de comando com a /V:ONopção, mas também pode fazer isso a partir de um prompt de comando existente, como no arquivo em lote abaixo.

@echo off

:: This batch file (prints the command to) rename files so that
:: any dots (.) are replaced with dashes (-)
::
:: Note, files with names containing percents (%) and exclamantions (!)
:: will intefere with command-prompt syntax and are not supported, but
:: can be worked around: https://stackoverflow.com/questions/5226793/

:: If this batch-file has no parameters...
if [%1]==[] (
    :: Open a new command-prompt with delayed-expansion enabled and call self
    cmd /v:on /c "%0" +
    :: Quit
    goto :eof
)

:: Recurse through all files in all subdirectories
for /r %%i in (*) do (

    rem (:: cannot be used for comments in a FOR loop)
    rem Check if it has an extension
    if [%%~xi]==[] (
        rem If it has an extension, preserve it
        set RENFN=%%~nxi
    ) else (
        rem Copy the path (and filename)
        set RENFN=%%~ni
        rem Check if it has a filename
        if not [%%~ni]==[] (
            rem If it has a filename, replace dots with dashes
            set RENFN=!RENFN:.=-!
        )
    )

    rem Rename original file
    ren "%%i" "!RENFN!%%~xi"

)

:: Exit spawned shell (no need to use setlocal to wipe out the envvar)
exit

:: Test output:
::
:: C:\t> dir /b/a
::
:: .txt
:: blah
:: file.blah.txt
:: foo.bar.txt
:: super duper. .blah.ttt. omergerd.---.mp4
:: t.bat
::
:: C:\t> t.bat
::
:: ren "C:\t\.txt" ".txt"
:: ren "C:\t\blah" "blah"
:: ren "C:\t\file.blah.txt" "file-blah.txt"
:: ren "C:\t\foo.bar.txt" "foo-bar.txt"
:: ren "C:\t\super duper. .blah.ttt. omergerd.---.mp4" "super duper- -blah-ttt- omergerd----.mp4"
:: ren "C:\t\t.bat" "t.bat"

informação relacionada