Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I have a directory structure as below:

  > SubFolder1
    > FileName1.abc
    > Filename2.abc
    > .............

  > SubFolder2
    > FileName11.abc
    > Filename12.abc
    > ..............

  > ..........

etc. I want to rename the files inside the subfolders as:


i.e. add the folder name at the beginning of the file name with the delimiter "_". The directory structure should remain unchanged. Note: Beginning of file name is same. e.g. in above case File*.

I made below Script

for /r "PATH" %%G in (.) do (

pushd %%G

for %%* in (.) do set MyDir=%%~n*

FOR %%v IN (File*.*) DO REN %%v "%MyDir%_%%v" popd )

Problem with the above script is that it is taking only one Subfolder name and placing it to the beginning of file name irrespective of the folder.

share|improve this question
Are you restricted to doing this with cmd.exe? This would be a LOT easier (trivial, actually) with a Unix shell. –  Nicole Hamilton Dec 7 '12 at 6:57
Yes I do want to do it in cmd only as I am on Windows. I know, by installing bash tools i can do it more easily in unix. But I was just curious to get it done in cmd. and want to use the built in features of windows effectively. Moreover I don't have permission to install any third party tool on the machine I am working on. –  shekhar Dec 7 '12 at 7:09
@NicoleHamilton - it is actually quite trivial in Windows batch as well. –  dbenham Dec 7 '12 at 13:24
@dbenham Your idea of trivial and my idea of trivial are quite different. –  Nicole Hamilton Dec 7 '12 at 15:34

3 Answers 3

To rename only files in the immediate child folders

@echo off
pushd "Folder"
for /d %%D in (*) do (
  for %%F in ("%%~D\*") do (
    for %%P in ("%%F\..") do (
      ren "%%F" "%%~nxP_%%~nxF"

To recursively rename all files in child folders

@echo off
pushd "Folder"
for /d %%D in (*) do (
  pushd "%%D"
  for /r %%F in (*) do (
    for %%P in ("%%F\..") do (
      ren "%%F" "%%~nxP_%%~nxF"

Make sure you only run either script once! You done want to put multiple prefixes in front of the files :-)

Additional code could be added to make it safe to run multiple times.

share|improve this answer

If you want to rename files inside subfolder only this is the solution.

for %%f in (.) do set "A=%%~dpnxf\"
for /r "%A%" %%f in (.) do call :func "%%~f"
goto :EOF
set "B=%~1"
for %%g in ("%B%") do set "C=%%~dpnxg"
for %%g in ("%C%") do set "D=%%~nxg"
cd  %C%
set "k=%C%\"
if NOT %A%==%k% FOR %%v IN (*.*) DO REN "%%v" "%D%_%%v" 
goto :EOF
share|improve this answer

You can do this in a more user friendly way using ReNamer, with a single renaming rule:

  1. Insert ":File_FolderName:_" as Prefix (skip extension)

You can also save it as a Preset and use it for command line renaming.

enter image description here

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.