Replace or delete certain characters from filenames of all files in a folder

208,131

Solution 1

Use PowerShell to do anything smarter for a DOS prompt. Here, I've shown how to batch rename all the files and directories in the current directory that contain spaces by replacing them with _ underscores.

Dir |
Rename-Item -NewName { $_.Name -replace " ","_" }

EDIT :
Optionally, the Where-Object command can be used to filter out ineligible objects for the successive cmdlet (command-let). The following are some examples to illustrate the flexibility it can afford you:

  • To skip any document files

    Dir |
    Where-Object { $_.Name -notmatch "\.(doc|xls|ppt)x?$" } |
    Rename-Item -NewName { $_.Name -replace " ","_" }
    
  • To process only directories (pre-3.0 version)

    Dir |
    Where-Object { $_.Mode -match "^d" } |
    Rename-Item -NewName { $_.Name -replace " ","_" }
    

    PowerShell v3.0 introduced new Dir flags. You can also use Dir -Directory there.

  • To skip any files already containing an underscore (or some other character)

    Dir |
    Where-Object { -not $_.Name.Contains("_") } |
    Rename-Item -NewName { $_.Name -replace " ","_" }
    

Solution 2

A one-liner command in Windows PowerShell to delete or rename certain characters will be as below. (here the whitespace is being replaced with underscore)

Dir | Rename-Item –NewName { $_.name –replace " ","_" }

Solution 3

The PowerShell answers are good, but the Rename-Item command doesn't work in the same target directory unless ALL of your files have the unwanted character in them (fails if it finds duplicates).

If you're like me and had a mix of good names and bad names, try this script instead (will replace spaces with an underscore):

Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(" ", "_") }

Solution 4

This batch file can help, but it has some limitations. The filename characters = and % cannot be replaced (going from memory here) and an ^ in the filenames might be a problem too.

In this portion %newname: =_% on every line in the lower block it replaces the character after : with the character after = so as it stands the bunch of characters are going to be replaced with an underscore.

Remove the echo to activate the ren command as it will merely print the commands to the console window until you do.

It will only process the current folder, unless you add /s to the DIR command portion and then it will process all folders under the current one too.

To delete a certain character, remove the character from after the = sign. In %newname:z=% an entry like this would remove all z characters (case insensitive).

@echo off
for /f "delims=" %%a in ('dir /a:-d /o:n /b') do call :next "%%a"
pause
GOTO:EOF
:next
set "newname=%~nx1"

set "newname=%newname: =_%"
set "newname=%newname:)=_%"
set "newname=%newname:(=_%"
set "newname=%newname:&=_%"
set "newname=%newname:^=_%"
set "newname=%newname:$=_%"
set "newname=%newname:#=_%"
set "newname=%newname:@=_%"
set "newname=%newname:!=_%"
set "newname=%newname:-=_%"
set "newname=%newname:+=_%"
set "newname=%newname:}=_%"
set "newname=%newname:{=_%"
set "newname=%newname:]=_%"
set "newname=%newname:[=_%"
set "newname=%newname:;=_%"
set "newname=%newname:'=_%"
set "newname=%newname:`=_%"
set "newname=%newname:,=_%"

echo ren %1 "%newname%
Share:
208,131
VSS
Author by

VSS

Updated on July 05, 2022

Comments

  • VSS
    VSS almost 2 years

    How do I delete certain characters or replace certain characters with other characters by some batch file execution, for filenames of all files in a Windows folder in one go, is there a DOS command for that?

  • AminM
    AminM over 9 years
    what is usage of Where-Object. aphoe answer do same without Where-Object
  • Ravi K Thapliyal
    Ravi K Thapliyal over 9 years
    @JesonPark Thanks for pointing this out. I've added some better examples on Where-Object usage.
  • MERT DOĞAN
    MERT DOĞAN about 9 years
    Rename-Item : Source and destination path must be different. error :/
  • MERT DOĞAN
    MERT DOĞAN about 9 years
    Rename-Item : Source and destination path must be different. error :/
  • Ravi K Thapliyal
    Ravi K Thapliyal about 9 years
    @MERTDOĞAN Rename-Item silently ignores a rename request if the destination path and name remains the same. For e.g., if no spaces to replace were found. It does not throw any errors. If you give us the exact PS commands you used, perhaps we can resolve your issue.
  • John Smith
    John Smith over 7 years
    Hey I don't quite understand where I should enter this command and how to target the directory I need.
  • aphoe
    aphoe over 7 years
    Only applicable on Windows OS. Run Windows PowerShell. Go to the folder and run the command as above (Remember to change the search params)
  • LosManos
    LosManos over 6 years
    Use -creplace for case sensitive searching.
  • Sip
    Sip over 6 years
    Did not work for me. I think because I wanted to replace dots. In that case, this answer helped me.
  • j4v1
    j4v1 over 6 years
    This solution worked for me (as accepted answer would throw errors, I presume due to a few files not containing the character to be replaced, as you mentioned). +1, I'd be great to have a bit more explanation about the -Recurse flag and the Move-Itemcommand in this context.
  • MartinJH
    MartinJH almost 6 years
    Also best solution for me. Does easily throw a "is used by another process" error. Closing all my other windows fixed this. Thanks Dustin :)
  • Modular
    Modular over 4 years
    @MERTDOĞAN See this answer Get-ChildItem -Recurse | Where-Object {$_.Name -match ' '} | Rename-Item -NewName { $_.Name -replace ' ','' } found on stackoverflow.com/a/8520172
  • Ivo Merchiers
    Ivo Merchiers over 4 years
    PowerShell Core is also supported on many other OS
  • Tropilio
    Tropilio over 3 years
    @AminM Where-Object is used to filter contents of the dir based on some criteria.
  • Bataklik
    Bataklik over 2 years
    How can I replace the first _ in a filename?
  • Joginder Tanikella
    Joginder Tanikella about 2 years
    Simple and efficient!
  • DefToneR
    DefToneR almost 2 years
    The edit queue is full so I put the note here: Note that the dir /a:-d is to list ONLY files, if you want to process all (files and directories) would be dir /a and for process ONLY directories dir /a:d Also is missing closing " at the end, that does not affect the code, but my TOC. if you want for example to remove dots in directory names should be: set "newname=%newname:.=%"