XeFM’s core file operations — copy, move, duplicate, and rename — all share the same conflict handling and progress display. This document covers how each one works and the options you can configure.
For the complete list of key bindings, see the XeFM User Guide or press ? in XeFM.
Copy the selected file(s) to the other pane.
Directories are copied recursively. If a name already exists at the destination, XeFM asks how to resolve it (see Conflict resolution).
XeFM confirms before copying by default. To skip the confirmation:
CONFIRM_COPY = False # default: True
Move the selected file(s) to the other pane.
(With nothing selected, M instead prompts for a new directory name — see Create File Operations.)
XeFM confirms before moving by default:
CONFIRM_MOVE = False # default: True
Move works the same whether the source and destination are on the same disk, on two different disks, or on cloud storage such as Amazon S3.
Because the original is removed only after a verified copy, a failed move across disks or storage never deletes your source files. Directory moves work too — all contained files are moved recursively.
For S3 you need AWS credentials configured and the boto3 package installed.
Cross-storage transfers depend on your network speed, so test with small files
first when setting up a new storage backend.
Make an in-place copy of a file or directory — XeFM’s equivalent of Finder’s Duplicate (⌘D). The copy lands in the same directory as the original, automatically renamed so it never collides.
Select one or more items (or just place the cursor on one), then choose Duplicate from either:
When nothing is explicitly selected, the entry under the cursor is duplicated; afterward the cursor lands on the new copy.
There is no default keyboard shortcut. To add one, bind the
duplicate_files action in your config, e.g.:
KEY_BINDINGS['duplicate_files'] = ['Shift-D']
Copy to Other Pane (C) also duplicates: when both panes show the same directory, copying auto-renames exactly like Duplicate instead of erroring. (Move still refuses a same-directory target.)
Duplicates use the same ` (N)` scheme as “Keep both” conflict resolution:
| Original | Duplicate | Next duplicate |
|---|---|---|
report.pdf |
report (1).pdf |
report (2).pdf |
photos (folder) |
photos (1) |
photos (2) |
.bashrc (dotfile) |
.bashrc (1) |
.bashrc (2) |
archive.tar.gz |
archive.tar (1).gz |
archive.tar (2).gz |
The suffix is inserted before the last extension for files and appended for directories and extension-less names.
Duplicating shows a confirmation dialog by default. Turn it off for instant, Finder-like behavior:
CONFIRM_DUPLICATE = False # default: True
Directories are duplicated recursively, so the confirmation is a useful guard against duplicating a large tree by accident.
When a copy, move, or archive extraction would overwrite an existing file, XeFM stops and asks what to do instead of silently overwriting. The dialog offers:
Choosing Rename opens an input field pre-filled with the original name. Edit it to whatever you want and press Enter. If the new name also collides, the dialog reappears so you can overwrite, rename again, or cancel — this repeats until you pick a free name or cancel.
Renaming lets you keep both files (the original and the incoming one) rather than overwriting, which is a safer choice for important files.
When several files collide, XeFM walks through them one at a time. For each conflict you can Overwrite, Rename, or Skip that file — or choose Skip All to skip every remaining conflict at once. Files with no conflict are copied or moved automatically. Each conflict is handled individually; there is no automatic numbering or pattern-based batch renaming (for that, see Batch Rename).
Conflict resolution works across every storage type XeFM supports (local ↔ S3, and so on) and is available whenever the corresponding confirmation setting is enabled:
CONFIRM_COPY = True # copy conflicts
CONFIRM_MOVE = True # move conflicts
CONFIRM_EXTRACT_ARCHIVE = True # extraction conflicts
All three are on by default.
Copy and move operations show detailed, real-time progress — especially useful for large files or directories with many files. The UI stays responsive while the transfer runs in the background.
The status bar shows an animated spinner, a file count, the current filename, and — for large files — byte-level progress:
⠋ Copying (to destination)... 45/100 (45%) - subdir/large_file.dat [67%]
Byte-level progress appears only for files large enough to take multiple read/write passes; small files complete too quickly to need it. Long filenames are truncated to fit the terminal width.
While an operation runs, normal input is blocked so you can’t move the cursor or start another command. Press ESC to cancel. Cancellation is checked between files and, for large files, at each chunk — so it may take a moment to stop at the next checkpoint. Partial files are removed cleanly, leaving nothing half-written behind.
This applies to remote transfers too: a slow upload to S3 or an SFTP server stops when you press ESC, rather than running to completion in the background. A cancelled S3 upload leaves no object behind and no partially uploaded pieces to be billed for; a cancelled download leaves no file on disk. An SFTP transfer stops within about half a second of the keypress.
Progress works across disks and storage types, so a move to an external drive gets the same per-file byte progress that a local copy, a cross-storage transfer, or an S3-to-S3 transfer does. No configuration is required — it is always on and adapts automatically to file size, file count, and terminal width.
Both check that the current directory is writable and refuse to overwrite an existing name.