#+title: dired-duplicates - Find duplicate files on local and remote filesystems

* Description
This Emacs package helps to find duplicate files on local and remote
filesystems.  It is similar to the fdupes command-line utility but written in
Emacs Lisp and should also work on every remote filesystem that TRAMP supports.
The most common use case for this is probably finding and deleting unneeded
duplicate files.

dired-duplicates works by first searching files of the same size, then invoking
the calculation of the checksum for these files, and finally presenting the
grouped results in a Dired buffer that the user can work with similarly to a
regular Dired buffer.  It might be even possible to combine this with other
Dired extension packages like =dired-narrow= for increased productivity.

By default, the results will be grouped visually by separating them using empty
lines, but this grouping can also be deactivated by setting the custom variable
=dired-duplicates-separate-result= to =nil=.

* Requirements
For performance reasons, a checksum program like =md5= or =sha256sum= will be
used for generating checksums of file contents if available and executable on
the local and/or remote hosts.  That way, no files need to be read over
possibly slow networks, thus calculating the checksum will be much faster when
directly executed on remote hosts.  The name of the checksum program can be
customized.  If unavailable, the file contents will be inserted into a temp
buffer and the checksum will be calculated using the =secure-hash= functions
with an appropriate algorithm.  While this works everywhere, it is generally
slower and could cause out-of-memory problems so there is a customizable
=dired-duplicates-internal-checksumming-size-limit= setting.  Files bigger than
this setting will not be processed, and a warning will be issued instead.

* Installation
The package can be installed from MELPA or GNU ELPA via the Emacs package
manager, e.g. ~package-install~.  Or you use the following use-package snippet:
#+BEGIN_SRC emacs-lisp
(use-package dired-duplicates)
#+END_SRC

* Usage
Call ~dired-duplicates~ interactively and provide one or more directories
(usually separated by commas) to search in recursively.

* Configuration
You can find all available customization options with ~customize-group~,
entering =dired-duplicates= for the desired group.  These options are described
extensively there.

* Known issues and reporting bugs
** Known issue with completing-multiple-read
At the moment, there is a problem in Emacs 28.1 and perhaps other versions with
~completing-read-multiple~ that makes auto-completion fail.  When you try to
specify more than one directory separated by commas (e.g. =/tmp/1,/tmp/2=), an
error /may/ occur depending on the completing system.  In such a case, you
might just do without auto-completion and ignore that error, dired-duplicates
will still function properly if you provide valid directories.

** Reporting bugs
Just open an issue at the homepage of this project in case you hit an error,
and provide proper steps to reproduce the problem.

* License
This package is licensed under GPL-3.  See the =LICENSE= file for more
information.
