Arquivo em lote para substituir “.” por “-”

0

Eu preciso preservar as extensões de arquivo e elas precisam 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, por favor, seja detalhado em sua resposta. Eu não tenho idéia do que qualquer um dos switches significa ou até mesmo como especificar o caminho para esse assunto.

    
por Brandon Ogle 09.11.2012 / 23:36

3 respostas

1

Eu concordo completamente com a outra resposta, na verdade. Um utilitário renamer de massa GUI seria tão muito mais fácil de usar. No entanto, apenas por diversão eu escrevi o seguinte arquivo em lote que deve recursivamente renomear todos os arquivos no diretório atual. e subdiretórios. e substitua. com - (assim, por exemplo, " Long .file .name.ext " se tornará " Long-file-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.

    
por 10.11.2012 / 00:31
0

De alguma forma eu não consigo entender por que você quer se preocupar com um arquivo de lote. Por que você não vai com uma das ferramentas de renomeação da GUI bazillion como:

link

Se esse em particular não flutuar no seu barco, confira este desfile:

link

    
por 10.11.2012 / 00:03
0

Esta é minha versão final e testada de um arquivo em lote que pode fazer o que você deseja. Ele funciona com arquivos com ou sem nomes de arquivos ou extensões, no entanto, arquivos com nomes de arquivos contendo % ou ! serão causar problemas .

Ele usa a expansão atrasada, então você deve executá-lo a partir de um prompt de comando com expansão atrasada (simplesmente executando setlocal /enabledelayedexpansion não vai cortá-lo porque isso só alterna se já estiver habilitado ; não tem 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 opção /V:ON , mas também pode fazê-lo 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"
    
por 10.11.2012 / 02:18