FileOps
Rename in place with a real template language, and an undo that puts it all back.
Free right now — no account, no card
Preview
1 interface design, then a screenshot of it running. Drag, scroll or use the arrows.
Free while we’re in preview
Get FileOps
Rename in place with a real template language, and an undo that puts it all back.
The Mac button is for Apple Silicon. On an older Intel Mac, get this one instead.
One file, both ways. Double-click it for the window. Run the same file from a command prompt with arguments and it behaves as the command-line tool, because the engine is inside it. Nothing else to download and nothing to keep beside it.
Early preview. The window has been built and run, but not yet on a real Windows PC or Mac, so expect rough edges. The engine underneath it is fully tested.
- One file — no installer
- Runs on your machine, offline
- Source code published below
Free while in preview. It isn’t signed yet, so Windows or macOS will ask you to confirm the first time you open it. At launch, FileOps is included in every plan along with the rest of the range.
Swaps come out right
Rename a to b and b to a in one batch and a naive tool destroys one of them. FileOps runs every batch in two phases: every source moves to a unique temporary name first, then every temporary moves to its destination. Arbitrary permutations and cycles of any length work, and a failure partway through rolls back what it already did.
Collisions abort the whole run
If two files would land on the same name, or a destination already exists on disk and isn’t itself being renamed away, FileOps reports every collision and renames nothing. Not even the files that were perfectly fine. There is no --force. A half-renamed directory is far worse than one that didn’t change.
The template language
--match is a Go regex against the filename. --to builds the new name from {1}, {name}, {ext}, {n}, {date} and {size}, with {upper:}, {lower:} and {title:} that nest and compose. Processing order is sorted and stable, so {n} means the same thing on every machine and the plan you previewed yesterday is the plan that runs today.
Files never leave their directory, and nothing is deleted or overwritten. Reorganising files into folders is FolderForge’s job.
Reading on the job itself
- How to rename hundreds of files at once Check the whole batch for collisions before renaming a single file. If two files would end up with the same...
Advanced & technical details Command-line builds, source code, checksums and a recorded session — for developers and IT teams
A working CLI prototype of the bulk-rename engine: a real template language (regex capture groups, counters, case transforms, date and size tokens), all-or-nothing collision safety so a clashing batch renames nothing at all, and a journal that reverses the entire operation. Verified: a mixed batch aborted without moving one file, and undo restored every path and hash exactly. EXIF/ID3 tokens and content find-and-replace are on the roadmap.
Recorded session
Naming status
Working name only — brand verdict **AVOID** (Very High). Collision: FileOps. Rename completely.
What it draws on
Existing paid software whose best ideas shaped this program: Directory Opus, Listary Pro, Duplicate Cleaner Pro, Advanced Renamer Commercial.
Command line
There is nothing extra to install. The program you download is the command-line tool as well: give it arguments instead of double-clicking it and it runs as one, with its output on your terminal. The standalone builds below are the same engine on its own, for machines where you would rather not ship a window at all.
fileops 1.0.0 - bulk rename engine with collision safety and undo
USAGE
fileops rename <dir> --match <regex> --to <template> [options]
fileops preview <dir> --match <regex> --to <template> [options]
fileops undo --journal <file> [--apply] [--json]
fileops help
COMMANDS
rename Plan renames; DRY RUN unless --apply is given.
preview Always read-only. Never touches the filesystem.
undo Reverse every rename recorded in a journal, newest first.
DRY RUN unless --apply is given.
OPTIONS
--match <regex> Go regular expression matched against the FILE NAME.
--to <template> Destination name template (see TEMPLATE TOKENS).
--recursive Descend into subdirectories. Files are renamed in place;
directories themselves are never renamed.
--start <N> First value of the {n} counter (default 1).
--pad <N> Zero-pad {n} to N digits (default 0, no padding).
--apply Actually perform the renames. Without it, nothing changes.
--journal <file> Write (rename) or read (undo) the JSON undo journal.
--json Emit machine-readable JSON on stdout.
-h, --help Show this help and exit 0.
TEMPLATE TOKENS
{1} {2} ... Regex capture groups ({0} is the whole match).
{name} Original file name without its extension.
{ext} Extension including the leading dot ("" if none).
{n} Sequence counter, honours --start and --pad.
{date} File mtime formatted YYYY-MM-DD.
{size} File size in bytes.
{upper:X} Uppercase whatever X renders to.
{lower:X} Lowercase whatever X renders to.
{title:X} Title-case whatever X renders to.
Transforms nest, e.g. {upper:{name}}-{n}{ext}
SAFETY
Files are visited in a deterministic sorted order, so {n} is reproducible.
...
Recorded from the shipped binary, not written by hand.
Source
Every file the program is built from:
console.go · console_test.go · guided.go · main.go
SHA-256 checksums · build instructions & scope notes · full build plan