6 votos

¿Cómo reemplazar un solo carácter en los nombres de archivo de Windows utilizando un archivo por lotes?

Tengo un servidor Windows Server 2003 que tiene un montón de nombres de archivo que necesitan ser renombrados. Básicamente, necesito todos los - (guiones) sustituidos por _ (guiones bajos), sin importar dónde se encuentren en el nombre del archivo. Se supone que no hay duplicados.

Puedo hacerlo en mi Mac con un pequeño script pero los archivos son demasiado grandes y locos para transferirlos a mi Mac, renombrarlos y luego volver al servidor. ¿Es posible hacer esto en un símbolo del sistema de Windows sin tener que descargar un renombrador o cualquier software adicional?

11voto

Muhammad Hassan Puntos 16

Desde la línea de comandos - suponiendo que todos sus archivos están en el mismo directorio:

UN SOLO PÁRRAFO

for /f "tokens=* delims= " %i in ('dir /b "*.txt"') do Set LIST=%i& set LIST | ren "%~fi" "%LIST:-=_%"

Tenga en cuenta que esto es un disparo por ventana de símbolo del sistema. Esto significa que si usted cancela esto por cualquier razón, entonces usted tendrá que abrir otro símbolo del sistema y ejecutar de nuevo.

5voto

Ismail S Puntos 352

Lo encontré en stackoverflow:

http://stackoverflow.com/questions/261515/batch-file-script-to-remove-special-characters-from-filenames-Windows

Set fso = CreateObject("Scripting.FileSystemObject")
Set re  = New RegExp

re.Pattern = "[-]" ' put all characters that you want to strip inside the brackets'
re.IgnoreCase = True
re.Global = True

If WScript.Arguments.Unnamed.Count = 1 Then
  If fso.FolderExists(WScript.Arguments.Unnamed(0)) Then
    Recurse fso.GetFolder(WScript.Arguments.Unnamed(0))
  Else
    WScript.Echo "Folder not found."
  End If
Else
  WScript.Echo "Please give folder name as argument 1."
End If

Sub Recurse(f)
  For Each sf In f.SubFolders
    Recurse sf
     WScript.Echo sf.Name, " -> ", re.Replace(sf.Name, "_")
    sf.Name = re.Replace(sf.Name, "_")
  Next
  For Each sf In f.Files
     WScript.Echo sf.Name, " -> ", re.Replace(sf.Name, "_")

     If sf.Name <> re.Replace(sf.Name, "_" ) Then
       sf.Name = re.Replace(sf.Name, "_")
     End If
  Next
End Sub

3voto

ddutra Puntos 123

Archivo por lotes para sustituir un carácter de un nombre de archivo por otro

Considera la posibilidad de utilizar una aplicación gratuita de GUI para que te lleve de la mano: http://www.bulkrenameutility.co.uk/Main_Intro.php

Si debe hacerlo usted mismo con un archivo por lotes, ¡tenga mucho cuidado! Los Batch scripts no tienen un botón de "deshacer". Si ejecuta su bat scriptsscriptscripts que se aplica a todos los archivos de forma recursiva bajo algún lugar como C: , acabas de cambiar el nombre de todos los archivos de tu ordenador e inmediatamente dejará de funcionar y fallará el boot. Tendrás que hacer una reinstalación completa del sistema operativo. Tenga siempre una copia de seguridad.

Primero tendrá que decidir si quiere que el archivo por lotes funcione en un solo archivo. ¿Que trabaje en todos los archivos de un directorio? O que lo haga recursivamente (todos los archivos/carpetas de un directorio). Aquí tienes algunos consejos:

Archivo por lotes para sustituir todos los guiones bajos _ con la letra M a todos los archivos del directorio actual

Ponga esto en un archivo por lotes llamado change_underscores_in_this_directory.bat

@echo off
setlocal enabledelayedexpansion
for %%a in (*_*) do (
  set file=%%a
  ren "!file!" "!file:_=M!"
)

Ejecútelo, y todos los archivos de ese directorio con un guión bajo serán cambiados por una 'M'.

Utilice un archivo de lotes para sustituir los espacios por nada (eliminando los espacios):

http://stackoverflow.com/questions/11270453/how-to-remove-spaces-from-file-names-in-bulk

Utilizar un archivo por lotes para sustituir los espacios por guiones bajos, de forma recursiva:

http://stackoverflow.com/questions/1613644/how-to-replace-names-recursively-via-Windows-batch-operation

1voto

Vlad Puntos 11

Otra solución sería utilizar dos archivos por lotes.

Expediente 1: run_rn.bat:

forfiles /m "*.log" /c " cmd /c rn @file"

Expediente 2: rn.bat:

set LIST1=%1
set LIST2=%LIST1:_=;%
ren %LIST1% %LIST2%

Los archivos por lotes tienen que estar en el mismo directorio que los archivos que quieres cambiar.

0voto

AdamV Puntos 4002

12noon tiene una utilidad GRATUITA para hacer renombramiento masivo de archivos con soporte completo de expresiones regulares, lo cual es bastante bueno. Página informativa de "Name Twister" con enlaces para su descarga

No he usado esta con rabia, pero he usado otras aplicaciones suyas (especialmente display changer) y he estado muy contento.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: