Program Spotlight: Rclone
Rclone is one of those command-line tools that you don’t realize you need until you have a specific, annoying problem. It’s a program for syncing files to and from cloud storage, often described as “rsync for cloud storage”. It supports dozens of providers like Google Drive, OneDrive, Dropbox, and S3-compatible storage.
But my favourite use case for rclone has nothing to do with the cloud at all. It’s copying photos and videos from a camera to my computer — and doing it reliably, which a simple drag and drop often isn’t.
Why copying from a camera is harder than it looks
Copying photos and videos from a camera is a special case compared to regular file transfers:
- There are a lot of files. A single day of shooting can produce hundreds or thousands of photos, plus several large video clips.
- The files are big. Video files especially can be several gigabytes each.
- The source is flaky. Cameras, memory cards, and card readers disconnect mid-transfer. USB hubs drop. Cards run out of space.
- You want certainty. You want to know that every file got copied, intact, and that no photo is silently corrupted or missing.
When you copy from one device to another using a regular file manager, you’re relying on a simple drag and drop. If the connection drops halfway through, you’re left with a partial file and no easy way to tell which files were actually copied. You end up re-copying everything, or trusting that the transfer went fine.
Rclone solves exactly this problem.
Why not just use cp, mv, or the file manager?
Fair question. If you’re comfortable in a terminal, cp -r or mv gets the
job done, and the GUI file manager is right there too. So why bother with
rclone?
The short answer: those tools copy files, but they don’t care about the outcome. When the source is a flaky camera card, that distinction matters.
cp doesn’t know what was already copied. Run it again and it re-copies
everything, or with -u it compares modification times and still re-reads a
lot of files. If the card disconnects halfway through, cp errors out and
leaves a partial file behind — and it won’t tell you that other files got
silently truncated. It never verifies anything; it just copies.
GUI file managers have the same problem under the hood. A dropped connection leaves partial files, there’s no way to tell which files actually made it, and verifying “did everything copy correctly” is up to you squinting at file sizes.
rsync is closer to what you want — it’s resumable with --partial, can
verify with --checksum, and skips files that are already there. If you only
ever copy locally from a card reader, rsync is a perfectly good answer.
What rclone adds on top is that it treats the camera the same way it treats a cloud remote. The exact same command that fills in the gaps after a dropped transfer, with the same flags, works when you point it at Google Drive instead of your card. And because rclone copies to a temporary file and renames it into place only when the transfer finishes, a partial file never survives a dropped connection. For me, that’s the difference between “I hope it copied” and “I know it copied.”
Copying photos and videos with rclone
The basic command is deceptively simple:
rclone copy /media/camera/DCIM ~/Pictures/Camera
copy transfers files from the source to the destination, skipping any files
that already exist in the destination. Run it again later and only new files
get copied. That alone makes it more reliable than a drag and drop — it’s
idempotent.
I usually add --progress to see what’s happening:
rclone copy /media/camera/DCIM ~/Pictures/Camera --progress
Why this is more reliable
- Atomic transfers. Rclone copies each file to a temporary file and only renames it into place once the transfer finishes. A dropped connection never leaves a partial file behind pretending to be the real thing.
- Resumable. If the camera disconnects, plug it back in and run the same command again. Files that already transferred are skipped and the remaining ones continue. No need to start over.
-
Verification. By default rclone compares file size and modification time. When you want to be extra sure, use
--checksumto compare actual hashes:rclone copy /media/camera/DCIM ~/Pictures/Camera --checksum -
Checking. After a copy, you can verify that source and destination match:
rclone check /media/camera/DCIM ~/Pictures/Camera --checksumcheckcompares both sides and reports any files that differ or are missing. That answers the “did I really copy everything?” question. -
Copy vs sync. If you want the destination to exactly match the source (deleting files that were removed from the card), use
sync:rclone sync /media/camera/DCIM ~/Pictures/CameraNote that
syncis destructive, so it’s worth being careful with it. I generally prefercopy.
Filtering
Not everything on the card needs to come over. Maybe you only want the photos, or only the videos. Rclone’s filters make that easy:
rclone copy /media/camera/DCIM ~/Pictures/Camera --include "*.JPG" --include "*.CR2"
Or the opposite, skipping videos you’ve already pulled:
rclone copy /media/camera/DCIM ~/Pictures/Camera --exclude "*.MP4"
Useful flags
The basic command is a good start, but rclone really shines once you start combining its flags. Let’s build up my typical camera copy step by step.
First, I want to see what’s actually happening. --progress gives a live
progress bar with per-file and overall stats:
rclone copy /media/camera/DCIM ~/Pictures/Camera --progress
Cameras and card readers aren’t always reliable, so I also like to verify what
got copied. By default rclone compares file size and modification time, but I
can force it to compare actual hashes with --checksum. It’s slower, but for a
once-a-day copy it’s worth the peace of mind:
rclone copy /media/camera/DCIM ~/Pictures/Camera --progress --checksum
Before committing to a new command, I always do a dry run. --dry-run shows
exactly what rclone would do without touching a single file:
rclone copy /media/camera/DCIM ~/Pictures/Camera --dry-run
If the camera disconnected mid-transfer last time, --ignore-existing comes in
handy. It skips files that already exist in the destination without even
checking whether they differ, so you can fill in the gaps without re-reading
the whole card. --size-only is a similar trick for when the modification
times on the card aren’t trustworthy.
Copying a few thousand photos one by one is slow, so I bump up the parallelism
with --transfers. The default is 4; on a decent machine 8 is fine. And if the
connection drops, --retries controls how many times rclone retries a failed
file before giving up (the default is 3):
rclone copy /media/camera/DCIM ~/Pictures/Camera \
--progress --checksum --transfers 8 --retries 5
Sometimes I only want part of the card. --max-size skips files larger than a
given size, which is a neat way to leave the big video files behind:
rclone copy /media/camera/DCIM ~/Pictures/Camera --max-size 100M
--min-size does the opposite, skipping files smaller than the limit. And if I
want to grab only what was shot recently, --max-age copies just the files
newer than a given age:
rclone copy /media/camera/DCIM ~/Pictures/Camera --max-age 7d
Finally, for long overnight transfers, --log-file writes a log to a file
instead of the console, so I can check in the morning exactly what happened.
The full workflow
Putting it all together, my routine looks like this. First, copy everything from the card to my Pictures folder, verifying as I go:
rclone copy /media/camera/DCIM ~/Pictures/Camera --progress --checksum
Then I confirm nothing was missed or corrupted:
rclone check /media/camera/DCIM ~/Pictures/Camera --checksum
Once the check passes, the card can be cleared. move transfers files and
deletes them from the source in one go — running it now simply removes the
files from the card, now that they’re safely on disk:
rclone move /media/camera/DCIM ~/Pictures/Camera
Or you can just format the card in the camera. The important thing is that you only clear it after the check passes.
Finally, the same command pushes the photos to the cloud, where they’re backed up away from the house:
rclone copy ~/Pictures/Camera remote:Photos/Camera --progress --checksum
That’s the whole pipeline: card to PC, PC to cloud, every step verified with the same tool and the same flags.
Browsing with rclone mount
Sometimes I don’t want to copy everything at once, or I just want to look at
what’s on the card before deciding. rclone mount turns a source into a normal
filesystem that you can browse in any file manager:
mkdir -p ~/mnt/camera
rclone mount /media/camera/DCIM ~/mnt/camera
Leave that running and the card shows up as a regular folder. The same trick works for cloud remotes, which is a nice way to browse cloud storage without installing a provider’s app:
mkdir -p ~/mnt/photos
rclone mount remote:Photos ~/mnt/photos
When you’re done, unmount it:
fusermount -u ~/mnt/camera
One caveat: when you copy files out of a mount, you’re back to regular file operations — no checksums, no atomic renames, none of the safety nets from earlier. I use mounts for browsing and poking around, but for the actual copy I always use the commands above.
Conclusion
If copying photos and videos from a camera is something you do regularly, a drag and drop is honestly a gamble. Rclone turns the whole thing into a repeatable, verifiable command that you can run again and again without worry. It’s one of those tools where once you start using it, you wonder how you ever did without it.