Skip to content
Support for rsync from Emacs dired buffers
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

dired-rsync – asynchronous rsync from dired


This package adds a single command dired-rsync which allows the user to copy marked files in a dired buffer via rsync. This is useful, especially for large files, because the copy happens in the background and doesn’t lock up Emacs. It is also more efficient than using tramps own encoding methods for moving data between systems.

Configuration is simple as you only need to bind the dired-rsync command to your prefered dired binding.

(use-package dired-rsync
  (bind-key "C-c C-r" 'dired-rsync dired-mode-map))


A variable called dired-rsync-modeline-status is provided for mode lines that will report the number of active rsync operations in progress. However by default that value is also set in mode-line-process which is a common place for things to report inferior process status. The variable dired-rsync-job-count contains the number of currently active dired-rsync jobs currently running.

For those that don’t like the way dired-rsync unmarks transferred files when it completes please see dired-rsync-unmark-on-completion.

The options dired-rsync-command and dired-rsync-options are there to modify the call to rsync but a user is unlikely to need to tweak these.

Technical Notes

While you can use rsync to copy files locally the main use case is copying files to/from a remote system. The rsync tool is always run locally as rsync needs working SSH authentication to work. If you can access a remote machine via tramp/ssh without having to enter a password (because ssh-agent is working) then rsync should work fine.

You can also do a remote-to-remote copy although this does involve setting up a port forward so the first remote can access the second remote. It’s ugly but it works.

The test used by dired-rsync is tramp-tramp-file-p which will mean any tramp path will attempt to be converted to an rsync path with optional ssh transport. Obviously if your remote target doesn’t also have ssh running and remote rsync binary this will fail. The reporting could be improved.

There have been several attempts at doing this but I found them wanting in usability. This attempts to clean up the ideas from:

in a hopefully cleaner and more idiomatic way.

You can’t perform that action at this time.