Automate File Names with Text to File Renamer: A Step-by-Step Guide

Text to File Renamer: Batch Rename Files from Plain Text Lists

Batch renaming dozens or thousands of files is tedious when done manually. “Text to File Renamer” is a simple, reliable approach: prepare the new names in a plain text list, then apply them to existing files in the desired order. This method is fast, minimizes errors, and works across platforms with a few common tools. Below is a step-by-step guide, best practices, and examples for Windows, macOS, and Linux.

Why use a text-to-file renamer?

  • Speed: Rename large sets of files in one operation.
  • Accuracy: Avoid typos by composing names in a text editor where editing is easier.
  • Repeatability: Keep the text list for audits, re-runs, or versioned renames.
  • Flexibility: Insert numbering, preserve extensions, and apply patterns.

Preparation

  1. Gather the files you want to rename into a single folder.
  2. Open a plain-text editor (Notepad, VS Code, TextEdit in plain-text mode).
  3. Create a list with one desired filename per line, matching the intended order. Include extensions if you want to control them (e.g., photo001.jpg). If you omit extensions, ensure the renaming method preserves original file extensions.

Example (names.txt): photo_001.jpg photo_002.jpg holiday_01.jpg holiday02.jpg

  1. Back up the folder or confirm you can restore files if needed.

Mapping rules and assumptions

  • Files will be sorted by a deterministic order (alphabetical by current filename, by creation/modification time, or by a specific numeric sort) — pick one and use consistent sorting.
  • The number of new names should match the number of files. If it doesn’t, either truncate files or pad names as needed.
  • Preserve extensions unless your chosen method explicitly replaces them.

Windows: Using PowerShell

  1. Place names.txt and the target files in the same folder.
  2. Open PowerShell in that folder.
  3. Use this script (adjust sorting if needed):

powershell

\(names</span><span> = </span><span class="token" style="color: rgb(57, 58, 52);">Get-Content</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">.</span><span> ames</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span>txt </span><span></span><span class="token" style="color: rgb(54, 172, 170);">\)files = Get-ChildItem -File | Sort-Object Name for (\(i</span><span> = 0</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)i -lt \(files</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span>Count</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)i++) { \(new</span><span> = </span><span class="token" style="color: rgb(54, 172, 170);">\)names[\(i</span><span class="token" style="color: rgb(57, 58, 52);">]</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">if</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">-not</span><span> </span><span class="token">[System.IO.Path]</span><span>::IsPathRooted</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(54, 172, 170);">\)new)) { \(ext</span><span> = </span><span class="token" style="color: rgb(54, 172, 170);">\)files[\(i</span><span class="token" style="color: rgb(57, 58, 52);">]</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span>Extension </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">if</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(54, 172, 170);">\)new -notmatch ’.[^.]+\('</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)new = \(new</span><span class="token" style="color: rgb(54, 172, 170);">\)ext } } Rename-Item -LiteralPath \(files</span><span class="token" style="color: rgb(57, 58, 52);">[</span><span class="token" style="color: rgb(54, 172, 170);">\)i].FullName -NewName \(new</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span></code></div></div></pre> <p>Notes:</p> <ul> <li>This preserves existing extensions if your names lack them.</li> <li>To sort by modification time, replace Sort-Object Name with Sort-Object LastWriteTime.</li> </ul> <h2>macOS / Linux: Using a shell script</h2> <ol> <li>Put names.txt and files in one directory.</li> <li>Open Terminal in that directory.</li> <li>Run this bash script:</li> </ol> <pre><div class="XG2rBS5V967VhGTCEN1k"><div class="nHykNMmtaaTJMjgzStID"><div class="HsT0RHFbNELC00WicOi8"><i><svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M15.434 7.51c.137.137.212.311.212.49a.694.694 0 0 1-.212.5l-3.54 3.5a.893.893 0 0 1-.277.18 1.024 1.024 0 0 1-.684.038.945.945 0 0 1-.302-.148.787.787 0 0 1-.213-.234.652.652 0 0 1-.045-.58.74.74 0 0 1 .175-.256l3.045-3-3.045-3a.69.69 0 0 1-.22-.55.723.723 0 0 1 .303-.52 1 1 0 0 1 .648-.186.962.962 0 0 1 .614.256l3.541 3.51Zm-12.281 0A.695.695 0 0 0 2.94 8a.694.694 0 0 0 .213.5l3.54 3.5a.893.893 0 0 0 .277.18 1.024 1.024 0 0 0 .684.038.945.945 0 0 0 .302-.148.788.788 0 0 0 .213-.234.651.651 0 0 0 .045-.58.74.74 0 0 0-.175-.256L4.994 8l3.045-3a.69.69 0 0 0 .22-.55.723.723 0 0 0-.303-.52 1 1 0 0 0-.648-.186.962.962 0 0 0-.615.256l-3.54 3.51Z"></path></svg></i><p class="li3asHIMe05JPmtJCytG wZ4JdaHxSAhGy1HoNVja cPy9QU4brI7VQXFNPEvF">bash</p></div><div class="CF2lgtGWtYUYmTULoX44"><button type="button" class="st68fcLUUT0dNcuLLB2_ ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ CPXAhl7VTkj2dHDyAYAf" data-copycode="true" role="button" aria-label="Copy Code"><svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M9.975 1h.09a3.2 3.2 0 0 1 3.202 3.201v1.924a.754.754 0 0 1-.017.16l1.23 1.353A2 2 0 0 1 15 8.983V14a2 2 0 0 1-2 2H8a2 2 0 0 1-1.733-1H4.183a3.201 3.201 0 0 1-3.2-3.201V4.201a3.2 3.2 0 0 1 3.04-3.197A1.25 1.25 0 0 1 5.25 0h3.5c.604 0 1.109.43 1.225 1ZM4.249 2.5h-.066a1.7 1.7 0 0 0-1.7 1.701v7.598c0 .94.761 1.701 1.7 1.701H6V7a2 2 0 0 1 2-2h3.197c.195 0 .387.028.57.083v-.882A1.7 1.7 0 0 0 10.066 2.5H9.75c-.228.304-.591.5-1 .5h-3.5c-.41 0-.772-.196-1-.5ZM5 1.75v-.5A.25.25 0 0 1 5.25 1h3.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-3.5A.25.25 0 0 1 5 1.75ZM7.5 7a.5.5 0 0 1 .5-.5h3V9a1 1 0 0 0 1 1h1.5v4a.5.5 0 0 1-.5.5H8a.5.5 0 0 1-.5-.5V7Zm6 2v-.017a.5.5 0 0 0-.13-.336L12 7.14V9h1.5Z"></path></svg>Copy Code</button><button type="button" class="st68fcLUUT0dNcuLLB2_ WtfzoAXPoZC2mMqcexgL ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ GnLX_jUB3Jn3idluie7R"><svg fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" d="M20.618 4.214a1 1 0 0 1 .168 1.404l-11 14a1 1 0 0 1-1.554.022l-5-6a1 1 0 0 1 1.536-1.28l4.21 5.05L19.213 4.382a1 1 0 0 1 1.404-.168Z" clip-rule="evenodd"></path></svg>Copied</button></div></div><div class="mtDfw7oSa1WexjXyzs9y" style="color: var(--sds-color-text-01); font-family: var(--sds-font-family-monospace); direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: var(--sds-font-size-label); line-height: 1.2em; tab-size: 4; hyphens: none; padding: var(--sds-space-x02, 8px) var(--sds-space-x04, 16px) var(--sds-space-x04, 16px); margin: 0px; overflow: auto; border: none; background: transparent;"><code class="language-bash" style="color: rgb(57, 58, 52); font-family: Consolas, "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: 0.9em; line-height: 1.2em; tab-size: 4; hyphens: none;"><span class="token shebang" style="color: rgb(238, 153, 0); font-weight: bold;">#!/usr/bin/env bash</span><span> </span><span></span><span class="token builtin" style="color: rgb(43, 145, 175);">mapfile</span><span> -t names </span><span class="token" style="color: rgb(57, 58, 52);"><</span><span> names.txt </span><span></span><span class="token assign-left" style="color: rgb(54, 172, 170);">files</span><span class="token" style="color: rgb(57, 58, 52);">=</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span> * </span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span></span><span class="token" style="color: rgb(0, 128, 0); font-style: italic;"># Optionally filter regular files only:</span><span> </span><span></span><span class="token" style="color: rgb(0, 128, 0); font-style: italic;"># files=( * )</span><span> </span><span></span><span class="token" style="color: rgb(0, 128, 0); font-style: italic;"># Use natural sort if needed: files=( \)(ls -1v) ) count=\({</span><span class="token" style="color: rgb(57, 58, 52);">#</span><span class="token" style="color: rgb(54, 172, 170);">files</span><span class="token" style="color: rgb(57, 58, 52);">[</span><span class="token" style="color: rgb(54, 172, 170);">@</span><span class="token" style="color: rgb(57, 58, 52);">]</span><span class="token" style="color: rgb(54, 172, 170);">}</span><span> </span><span></span><span class="token" style="color: rgb(0, 0, 255);">for</span><span> </span><span class="token for-or-select" style="color: rgb(54, 172, 170);">i</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">in</span><span> </span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(54, 172, 170);">\){!files[@]}; do name=\({names</span><span class="token" style="color: rgb(57, 58, 52);">[</span><span class="token" style="color: rgb(54, 172, 170);">i</span><span class="token" style="color: rgb(57, 58, 52);">]</span><span class="token" style="color: rgb(54, 172, 170);">}</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span> </span><span> </span><span class="token assign-left" style="color: rgb(54, 172, 170);">file</span><span class="token" style="color: rgb(57, 58, 52);">=</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(54, 172, 170);">\){files[i]} ext=\({file</span><span class="token" style="color: rgb(57, 58, 52);">##</span><span class="token" style="color: rgb(54, 172, 170);">*.}</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">if</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">[</span><span class="token" style="color: rgb(57, 58, 52);">[</span><span> </span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(54, 172, 170);">\)name != . ]]; then name=\({name}</span><span class="token" style="color: rgb(163, 21, 21);">.</span><span class="token" style="color: rgb(54, 172, 170);">\){ext} fi mv\(file</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span> </span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(54, 172, 170);">\)name done

Notes:

  • Use ls -1v or sort -V for natural numeric ordering if filenames include numbers.
  • If files include spaces or special chars, the script above handles them when run in bash supporting mapfile.

When the list and files differ in count

  • Fewer names than files: rename only the first N files; leave the rest unchanged.
  • More names than files: ignore extra names or create placeholder files if intentionally needed.
  • Best practice: ensure counts match; use a quick check:
    • PowerShell: Compare \(names.Count and \)files.Count.
    • Bash: echo “\({#names[@]} vs \){#files[@]}”.

Adding numbering or padding

If your text list needs numbering inserted automatically, create names with placeholders like “{num}” and generate names programmatically. Example PowerShell snippet:

powershell

\(names</span><span> = </span><span class="token" style="color: rgb(57, 58, 52);">Get-Content</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">.</span><span> emplate</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span>txt </span><span></span><span class="token" style="color: rgb(0, 0, 255);">for</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(54, 172, 170);">\)i=0; \(i</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">-lt</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)files.Count; \(i</span><span class="token" style="color: rgb(57, 58, 52);">++</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)new = \(names</span><span class="token" style="color: rgb(57, 58, 52);">[</span><span class="token" style="color: rgb(54, 172, 170);">\)i] -replace ’{num}’, (’{0:D3}’ -f ($i+1)) ... }

Validation and rollback

  • Dry run: print proposed renames before applying.
    • PowerShell: replace Rename-Item with Write-Output.
    • Bash: replace mv with echo mv.
  • Keep a record: save a CSV mapping original to new names so you can reverse the operation if needed.
    • Example CSV line: “oldname.jpg”,“newname.jpg”

Tools and GUI alternatives

  • Bulk Rename Utility (Windows) — powerful GUI with rules and preview.
  • Advanced Renamer (Windows) — supports import from text lists.
  • NameChanger (macOS) — simple GUI batch renamer.
    These tools offer previews and undo features if you prefer not to script.

Troubleshooting

  • Incorrect order: ensure both file listing and names.txt use the same sort logic (alphabetical vs. numeric vs. timestamp).
  • Extension lost: confirm your script preserves or appends extensions.
  • Permission errors: check file permissions and run with appropriate privileges.

Example workflow (concise)

  1. Backup folder.
  2. Create names.txt with one name per line (include extensions or let script append them).
  3. Run a dry run script to list proposed renames.
  4. Apply rename script.
  5. Save mapping CSV for rollback.

Using a text-to-file renamer workflow removes manual tedium and reduces mistakes when renaming many files. With a short text list and a reliable script or GUI tool, you can rename entire collections consistently and repeatably.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *