All projects

Copy Pasta

A cross-platform file copier with a live progress bar and sane conflict handling.

WindowsmacOSLinuxWSLSource on GitHub

What Copy Pasta is

A terminal tool for copying and moving files and folders that checks its own work: every file is hashed on both sides once it lands, and a copy that does not match is reported instead of counted. Alongside that, the two things the usual commands leave out: a live progress bar with speed, time left and size, and an explicit choice about what happens when a name already exists. Folders are walked first and then copied by a pool of worker threads, so a tree of small files moves at the speed of the disk. It also shows the machine’s CPU, memory, disk and GPU, and remembers your last ten operations and the paths you typed. Python 3.8 and three packages, on Windows, macOS, Linux and WSL.

Copy Pasta features

What it actually does.

Copy and move

Single files or whole directory trees, recursively, from one menu.

Live progress

Percentage, speed, time left and bytes done out of the total, updated as it runs.

Conflicts, decided once

Skip all, replace all, or rename all with a number added: file (1).txt.

History

The last ten operations with source, destination, time and result, plus your recent paths, and a menu entry to clear them.

System info

CPU, memory, disk, GPU and operating system in one table.

Tab completion

Every path prompt completes as you type.

Every copy checked

Once a file lands, both copies are read back a megabyte at a time and their hashes compared. A copy that does not match is reported rather than counted as done — the part the usual commands leave to faith.

Directories copy in parallel

A folder is walked first, then its files are handed to a pool of worker threads, so a tree of small files moves at the speed of the disk instead of one file at a time.

How to use Copy Pasta

From a fresh install to the thing working.

1 Install it

  1. Install Python 3.8 or newer.
  2. Run pip install rich questionary psutil.
  3. Save the script, fm.py, anywhere you like. There is nothing else to install.

2 Copy or move something

  1. Run python fm.py.
  2. Choose copy or move, for files or for a directory.
  3. Type the source and the destination. Tab completion helps.
  4. If names collide, choose skip, replace or rename for all of them, then watch the progress bar.

3 Check what happened

  1. View History lists the last ten operations and whether each one succeeded.
  2. Clear Cache wipes the history and the remembered paths.

4 If something is off

  1. Permission errors on system folders: run it with sudo, or as Administrator on Windows.
  2. Slow with many small files: raise the worker count in the source to match your CPU cores.
  3. Colours look wrong: use a true-colour terminal such as Windows Terminal, iTerm2, GNOME Terminal, Kitty or Alacritty.

Built with

Python 3.8+ Rich questionary psutil ThreadPoolExecutor hashlib

Licence

Made by Kencypher. Not open source.

Copy Pasta was written by Kencypher. The source is not published and is not licensed for reuse. You have permission to run it — that is the whole of it.

You may

  • Run it on as many of your own machines as you like
  • Use it for anything, including commercial work
  • Pass an unmodified copy to a friend, free

You may not, without asking

  • Sell it or charge for access
  • Re-upload or mirror it anywhere
  • Rebrand it or publish it as your own
  • Decompile it or lift its assets

This is enforced. Re-uploading it, repackaging it, stripping the author's name off it or passing it off as your own is copyright infringement — protected without registration under the Berne Convention — and is pursued with DMCA takedowns to the host, CDN, app store and search engine, platform reports for impersonation, and legal proceedings where the infringement is commercial, repeated, or involves falsely claiming authorship.

Asking first is free, and the answer is usually yes — kencypher56@gmail.com. The only official source is this store; a copy from anywhere else is not one Kencypher published.

Good to know