Home / Guides

Batch rename on Mac and Windows: what is already built in

Last updated .

Both operating systems can already rename many files at once. It is worth knowing exactly where those built-in tools stop, because that boundary is the only reason a separate tool is worth using.

macOS: Finder's Rename Items

Select files → right-click → Rename N Items… You get three modes: replace text, add text (prefix or suffix), and format (name + index + counter). Plus "before the name / after the name" placement.

What it cannot do:

The workaround people use is Automator's Get Folder Contents → Rename Finder Items, or a shell loop. Both are fine if the naming rule is mechanical. Neither helps when the list of new names came from a client, a shot list, or a spreadsheet.

macOS: mv in Terminal

The most flexible option on either platform, and the one that bites hardest. A loop reading a CSV will overwrite files silently on collision, and quoting names with spaces, apostrophes or leading dashes is its own small discipline. There is no dry run unless you build one.

Windows: PowerToys PowerRename

A genuinely good tool: search-and-replace across filenames, with regular expressions, a preview pane, and the ability to apply changes to file contents. It is the closest built-in-adjacent thing to what most people need for mechanical renames.

What it cannot do: map file A to a specific name from an external list. It is a transform, not a lookup. If your new names are whitby-abbey-sunrise-01 through -47 and the photos are in a random order, a regex gets you partway and then you are editing 47 filenames by hand.

Windows: Explorer's rename-selection trick

Select a group, press F2, type one name — you get name (1), name (2), … That is it. Useful once; useless as a workflow, and it cannot be undone except with Ctrl+Z immediately after.

Windows: PowerShell Rename-Item

Import-Csv map.csv | ForEach-Object {
  Rename-Item -LiteralPath $_.old -NewName $_.new -WhatIf
}

Remove -WhatIf and it works — but it throws on the first missing file, does not check whether two rows produce the same target, and does not know about reserved names until the OS rejects them mid-batch. It is a reasonable tool for someone who writes scripts weekly; it is a trap for someone doing this once.

The gap all of them share

TaskFinderPowerRenamemv/PowerShellMass Rename
Apply one pattern to many filesYesYesYesYes (via the sheet)
Rename A→X, B→Y, C→Z from a listNoNoYes, with a scriptYes
Preview before committingRich previewYesOnly with -WhatIfYes
Detect duplicate targetsn/aPartialNoYes, refuses both
Block Windows-illegal namesNoNoNoYes
Report of what changedNoNoNoYes, CSV
Install requiredNoYesNoNo

When to use which

Two habits worth having either way

  1. Rename a copy first. Run the batch on five files, look at the result, then do the other 295.
  2. Keep the mapping. Whatever produces the new names, keep the old→new table. It is the only way to undo a rename six months later, and it is what the report CSV is for.

Open the renamer →

Next: renaming from an Excel list · renaming from a CSV