Rename file extensions in bulk, including files in subfolders

by admin on July 3, 2012

This post talks about how to rename file extensions in bulk using simple commands. No 3rd party tools are required. At the end of the post, you can find a download link for the batch file script.

Change file extensions in bulk:

We can change the extension of files in batch using rename command. For example, let’s say you have set of files with extension .log and you want to rename them to .txt.  You can do this with the below command

rename  *.log   *.txt

The drawback with this command is, we can’t use it to rename file extensions recursively in the sub folders. Next, we’ll look at a solution which allows us to do so.

Recursively rename file extensions

If you want to rename files from one extension to another, recursively in all sub folders, then you can use the below command.

forfiles /S /M *.ext1 /C "cmd /c rename @file @fname.ext2"

For example, if you want to rename all xml files to txt files, the command would be as below

forfiles /S /M *.xml /C "cmd /c rename @file @fname.txt"

Remove file extensions in batch

The below command would remove extension for the specified file types.

forfiles /S /M *.ext /C "cmd /c rename @file @fname"

If you want a batch file script, it can be downloaded from the below link:
Batch file script for renaming file extensions in bulk

Add prefix to file names in batch

If you want to add any prefix to file names, it can be done as in the below example. Here we try to add ‘photo’ to every jpg file in the current folder and subfolders.

forfiles /S /M *.jpg /C "cmd /c rename @file photo@file"

Similarly, we can add a number to a file name.

forfiles /S /M *.jpg /C "cmd /c rename @file 99@file"

Handling names with white spaces

If the new name you want to assign to the files has white space within it, it can be done by adding double quotes around the file name. So that forfiles does not misinterpret this doublequotes, you need to escape them with ‘\’
For example to add ” – pic.jpg” to each of the jpg files, the command would be as below.

forfiles /M *.jpg /C "cmd /c rename @file \"@fname - pic.jpg\""

{ 26 comments… read them below or add one }

DPS Chawla February 24, 2014 at 5:17 pm

Great Thanks REgards

Reply

atul June 17, 2014 at 11:35 am

thanks for suggestion

Reply

devilJake June 18, 2014 at 4:08 pm

I want only the extensions of files starting with certain type of names to be renamed, within the folder as well as subfolders.
How can I do it?
For example:
rename all files starting with the name “*-common.xml” to “*-common.xml.txt”

The other .xml files have to be left intact.

Reply

admin January 14, 2015 at 8:18 pm

This should do

ren  *-common.xml  *-common.xml.txt

devilJake June 18, 2014 at 5:08 pm

Figured it by out myself.

forfiles /S /M *-common.xml /C “cmd ren *-common.xml *-common.xml.txt”

Reply

admin January 14, 2015 at 8:20 pm

If you are using forfiles, you donot need to use * again in the cmd part.

forfiles /S /M *-common.xml /C "cmd ren @file @file.txt"

Cathryne July 10, 2014 at 3:02 pm

Thanks for these hints :-) Is it also possible to include a space in the prefix? I tried the following:

forfiles /S /M *.jpg /C "cmd /c rename @file "photo location - "@file"

=> The syntax of the command is incorrect

forfiles /S /M *.jpg /C "cmd /c rename @file 'photo location - '@file"

=> ERROR: Invalid argument/option…

Reply

admin January 9, 2015 at 5:46 am

The file name need to be surrounded with double quotes if it has white spaces. Added example command to the post.

Volker September 25, 2014 at 9:13 am

I have here some files with ending like this
(1).txt
e.g. file_a(1).txt
I tried this
forfiles /S /M *.ext1 /C "cmd /c rename @file @fname.ext2" for renaming them to .txt
e.g. file_a.txt

Can you help me?

Reply

Will October 23, 2014 at 5:06 pm

The “Add prefix to file names” code is faulty. When I ran it, it keeps adding the prefix to all of the files in the folder over and over again until I kill it.

Reply

admin October 24, 2014 at 12:02 am

It worked fine for me. Can you tell me how many files you have in the folder that you were intending to add the prefix?

Masim October 29, 2014 at 6:57 am

I just tried to rename midi karaoke files to midi files,

forfiles /S /M *.kar /C "cmd /c rename @file @fname.mid"

This doesn’t work if the file name has spaces in it, (OS Win XP Sp3).
But I found other solution that works flawlessly

FOR /R %f IN (*.kar) DO REN "%f" *.mid

For more info:
https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/for.mspx?mfr=true

Reply

Ap.Muthu January 8, 2015 at 6:32 am

None of the websites including this has alluded to the renaming of files by removal a second extension.

If a folder contains several files like *.mo.po and *.mo as file extensions, how do we selectively rename the *.mo.po to *.po whilst not touching the *.mo that were already there?

Reply

admin January 9, 2015 at 12:18 am

Try this command

forfiles /M *.mo.po  /C  "cmd /c rename @file @fname"

It works only if you don’t have files with the same name and two different extensions.
ex: 1.mo.po and 1.mo. You would get error in renaming as a file already exists with the name.

Let us know if it works for your usecase.

steve szajko January 14, 2015 at 7:44 pm

A virus added .zwrkocj to all file types, how would I remove that?

Reply

admin January 14, 2015 at 8:15 pm

If it has converted files like file.ext to file.ext.zwrkocj then I think you can run the below to get back to original state.

ren *.zwrkocj *. 

cta January 23, 2015 at 5:34 pm

How to append the name of the parent folder onto the prefix of the file name?

Reply

garegin March 12, 2015 at 7:52 pm

forfiles /S /M *.ext /C “cmd /c rename @file @fname”

changed files in all of C drive, right?
how can you specify a specific folder and its subfolders?
how can you turn off recursion?

Reply

admin March 14, 2015 at 8:24 pm

We can’t restrict the recursion to one level. You might need to write a custom batch script to do that.

Ankur April 4, 2015 at 9:09 pm

Hi

I have one question.
I created a bat file for renaming all the files to one extension

forfiles /S /M *.* /C “cmd /c rename @file @fname.jpeg”

but this also changes the extension of my bat file.
Can I exclude bat file in any way.
Thanks for your help on this.

Reply

admin April 6, 2015 at 4:59 pm

Why not place this bat file in some other folder, outside the current directory tree?

Michael April 10, 2015 at 8:40 pm

Great stuff guys. This probably saved me about an hours worth of work.

Reply

Austin April 28, 2015 at 9:38 pm

I can’t seem to get the white spaces code to work.
forfiles /s /m *.* /C “cmd /c rename @file \”(PA) @file\””

Your Example:
forfiles /M *.jpg /C “cmd /c rename @file \”@fname – pic.jpg\””

Is there anything that is wrong with the above code. This is the following error “Unrecognized token in source text.”

Reply

admin April 28, 2015 at 10:33 pm

It worked for me.

c:\tmp>dir /s /b
c:\tmp\testfile.txt
c:\tmp>forfiles /S /M *.txt  /C "cmd /c rename @file \"(PA) @file\""
c:\tmp>dir /s /b
c:\tmp\(PA) testfile.txt

I guess something could be wrong if you had copy pasted the command. Especially the double quotes usually get wrong. I would suggest to type the command(rather than copy/paste), it should work.

Austin May 4, 2015 at 5:17 pm

Would the error be caused by running the commands simply from a PS1 Script? That’s the only reason I can think of.

Well I ended up Scripting a simply tool in Access VBA.

Vishwa June 10, 2015 at 1:02 am

‘forfiles’ command seems to have come very close to serving my need but is there a way to remove a prefix from a set of files recursively?

Example:
TT-*.* to *.*
I want to remove ‘TT-‘ from all the files

Reply

Leave a Comment

Previous post:

Next post: