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 /enabledelayedexpansion
nã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:ON
opçã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"