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:
- rename each file to a different, arbitrary name that you supply — it applies one rule to all of them;
- read the names from a spreadsheet, CSV, or text file;
- tell you afterwards which files changed;
- refuse a name that is illegal on Windows, which matters the moment the folder is shared.
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
| Task | Finder | PowerRename | mv/PowerShell | Mass Rename |
|---|---|---|---|---|
| Apply one pattern to many files | Yes | Yes | Yes | Yes (via the sheet) |
| Rename A→X, B→Y, C→Z from a list | No | No | Yes, with a script | Yes |
| Preview before committing | Rich preview | Yes | Only with -WhatIf | Yes |
| Detect duplicate targets | n/a | Partial | No | Yes, refuses both |
| Block Windows-illegal names | No | No | No | Yes |
| Report of what changed | No | No | No | Yes, CSV |
| Install required | No | Yes | No | No |
When to use which
- Mechanical rule, one folder, you are on a Mac: Finder's Rename Items. It is already there and it has an undo.
- Regex rename, you are on Windows: PowerRename. Install PowerToys once; it is worth it for other reasons too.
- You write scripts anyway:
mvorRename-Itemwith a dry run. Nothing here beats a shell you already trust. - The new names exist in a spreadsheet, a client email, or a list: that is a lookup, not a transform — use the mapping tool, or generate a script from the exported plan.
Two habits worth having either way
- Rename a copy first. Run the batch on five files, look at the result, then do the other 295.
- 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.