First, Rule Out Sequential Numbering
Before anything else, decide which problem you actually have. If you'd be happy with Photo_001, Photo_002, Photo_003, that's sequential numbering, and Windows File Explorer does it natively: select the files, press F2, type a base name, and it appends numbers. That's covered in how to rename multiple files on Windows. It is not what this page solves.
This page is for when each file needs a genuinely different, meaningful name, invoice-acme-nov, invoice-globex-dec, contract-smith-signed, and there's no counter that produces those. For that, the names have to come from somewhere, and there are two places they can come from.
Method 1: A Mapping List (You Already Know the Names)
If you already have, or can quickly build, a list pairing each old filename with its new name, a mapping is the cleanest solution. You put the pairs in a spreadsheet or CSV, old name in one column, new name in the next, and a tool or short script renames each file to its match.
This is the right method whenever the names exist outside the files, in your head, in an email, in a catalog, and just need to be applied. Because it's a common enough need to deserve its own walkthrough, the full spreadsheet-driven workflow lives on rename files from an Excel list. Use that when your batch is more than a handful of files and you can express the new names as a list.
Before you run any mapping, do two quick sanity checks. First, confirm the number of rows in your list matches the number of files you mean to rename, so nothing is left behind and no row points at a file that isn't there. Second, scan the new-name column for duplicates, because if two files would resolve to the same name the rename either silently overwrites one of them or errors out partway through, leaving your batch half-renamed and hard to recover. Sorting the list by the new name makes any accidental repeats jump out immediately.
Method 2: A PowerShell Lookup (When the Mapping Has Logic)
If the mapping follows some rule you can express, or you just prefer scripting, a PowerShell hashtable works well for a small, known set. Keep the set small and well defined, though, because a hashtable typed by hand gets error-prone past a dozen or so entries, and a stray typo in a key means that file is silently skipped rather than flagged. You define the pairs and rename each file to its looked-up value:
- Define the map: $map = @{ 'DSC0001.jpg' = 'front-cover.jpg'; 'DSC0002.jpg' = 'back-cover.jpg' }
- Loop and rename each matching file: $map.GetEnumerator() | ForEach-Object { Rename-Item $_.Key -NewName $_.Value }
- Add -WhatIf to the Rename-Item to preview the result before applying.
- For a longer list, import it from a CSV instead of typing pairs by hand, which is where the Excel-list method takes over.
Method 3: Manual, One File at a Time
For a small batch, ten files or fewer, the low-tech method is often fastest: click a file, press F2, type its name, press Enter, repeat. On Windows and Mac alike this needs no tools and no setup. Even here it helps to work from a written list rather than your memory, ticking off each file as you go, so you never skip one or accidentally reuse a name you already assigned to an earlier file. It stops being reasonable the moment the batch grows or you'd have to open each file to know what to call it, which is the exact signal that you need one of the other methods.