How to replace a single character in Windows filenames using a batch file?

7

5

I have a Windows Server 2003 server that has a whole bunch of filenames that need renaming. Basically, I just need all - (hyphens) replaced with _ (underscores), no matter where they are in the filename. Assume that there are no duplicates.

I can do this on my Mac with a little script but the files are too large and crazy to transfer to my Mac, rename, then go back to the server. Is it possible to do this in a Windows command prompt without having to download a renamer or any additional software?

Matt Rogish

Posted 2009-11-05T00:58:16.247

Reputation: 775

2You could simply rename them from your other computer over SMB. No need to copy files just for a name change. – Joey – 2009-11-05T07:23:51.067

Answers

11

From the command prompt - assuming that all of your files are in the same directory:

ONE-LINER

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

Keep in mind that this is a one shot per command prompt window. That means if you cancel this for any reason, then you'll need to open another command prompt and run again.

Murdoch Ripper

Posted 2009-11-05T00:58:16.247

Reputation: 499

I edited it for a little correction (I had problems with spaces inside the filenames) – Daniel Mošmondor – 2012-03-13T21:09:45.580

2I was trying to figure out a for /f method for it and my brain leaked out through my ears well before I got to the solution. Cracking bit of code, well done! – AdamV – 2009-11-05T03:14:08.557

Thanks Adam. This actually took me about a week to figure out how to do. The only reason I did it was because of Command Line Kung Fu!

(http://blog.commandlinekungfu.com/2009/05/not-ready-yet-episode-replacing-strings.html)

– Murdoch Ripper – 2009-11-05T03:55:51.737

Nice!!! I have a one-liner on my mac that I used, was hoping for one in Windows. NICE JOB! – Matt Rogish – 2009-11-05T14:07:27.450

does this work for folders as well? – Sun – 2013-07-18T18:42:11.660

Yes, it does. Just change the following code from "('dir /b "*.txt"')" to "('dir /ad')". – Murdoch Ripper – 2013-10-30T00:47:16.710

3

Batch File to replace one character in a filename with another character

Consider using a free GUI app to hold your hand: http://www.bulkrenameutility.co.uk/Main_Intro.php

If you must this yourself with a batch file, be super careful! Batch scripts don't have an "undo" button. If you execute your bat script which applies to all files recursively under somewhere like C:, you've just renamed every file on your computer and it will immediately stop working and fail to boot. You'll have to do an full OS reinstall. Always have a backup!

First you'll have to decide do you want the batch file to work on a single file? To work on all files in a directory? Or do have it done recursively (all files/folders under a directory). Here are some pointers:

Batch file to replace all underscores _ with the letter M to all files in current directory

Put this in a batch file named change_underscores_in_this_directory.bat

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

Execute it, and all the files in that directory with an underscore will be changed to an 'M'.

Use a Batch File to replace spaces with nothing (removing the spaces):

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

Use a Batch File to replace spaces with underscores, Recursively:

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

Eric Leschinski

Posted 2009-11-05T00:58:16.247

Reputation: 5 303

It works great! – Marco Demaio – 2015-01-14T12:57:05.150

2

Found it on stackoverflow:

https://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

Matt Rogish

Posted 2009-11-05T00:58:16.247

Reputation: 775

1this seems to be removing, rather than replacing, although I am sure it could be amended reasonably easily – AdamV – 2009-11-05T02:43:57.453

the post you link to includes instructions for running the script, it would be helpful if you included that info in your answer. – quack quixote – 2009-11-05T03:21:10.213

1

Another solution would be to use two batch files.

File 1: run_rn.bat:

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

File 2: rn.bat:

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

The batch files have to be in the same directory like the files you want to change.

Vlad

Posted 2009-11-05T00:58:16.247

Reputation: 11

0

12noon has a FREE utility to do mass file renaming with full regular expression support, which is pretty cool. "Name Twister" info page with links to download

I haven't used this one in anger, but have used other apps of theirs (especially display changer) and been really happy.

AdamV

Posted 2009-11-05T00:58:16.247

Reputation: 5 011