rdfind(1)

NAME
rdfind - finds duplicate files

SYNOPSIS
rdfind [ options ] directory1 | file1 [ directory2 | file2 ] ...

DESCRIPTION
rdfind finds duplicate files across and/or within several directories. It calculates checksums only if necessary. Directories are searched recusively. If two (or more) equal files are found, the program decides which of them is the original and the rest are considered duplicates. This is done by ranking the files to each other and deciding which has the highest rank. See section RANKING for details. By default, no action is taken besides creating a file with the detected files and showing the possible amount of saved space. If you need better control over the ranking than given, you can use some preprocessor which sorts the file names in desired order and then run the program using xargs. See examples below for how to use find and xargs in conjunction with rdfind. To include files or directories that have names starting with -, use rdfind ./- to not confuse them with options.

RANKING
Given two or more equal files, the one with the highest rank is selected to be the original and the rest are duplicates. The rules of ranking are given below, where the rules are executed from start until an original has been found. Given two files A and B which have equal size and content, the ranking is as follows: If A was found while scanning an input argument earlier than B, A is higher ranked. If A was found at a directory depth lower than B, A is higher ranked (A is closer to the root). if A and B are found during scanning of the same input argument and share the same directory depth, the one that ranks highest depends on if deterministic operation is enabled. This is on by default, see option -deterministic). If enabled, which one ranks highest is unspecified but deterministic. If disabled, the one that was reported first from the file system is highest ranked.

OPTIONS
Searching options etc:

-ignoreempty true|false
    Ignore empty files. Setting this to true (the default) is equivalent to -minsize 1, false is equivalent to -minsize 0.

-minsize N
    Ignores files with less than N bytes. Default is 1, meaning empty files are ignored.

-maxsize N
    Ignores files with N bytes or more. Default is 0, which means this check is disabled.

-followsymlinks true|false
    Follow symlinks. Default is false.

-removeidentinode true|false
    Removes items found which have identical inode and device ID. Default is true.

-checksum none|md5|sha1|sha256|sha512|xxh128
    What type of checksum to be used: md5, sha1, sha256, sha512 or xxh128. The default is sha1 since version 1.4.0. xxh128 is a very fast checksum, but not of cryptographic quality. xxh support is optional and requires that rdfind was configured with --with-xxhash. In case xxh is used but there is no support, an error is returned. Checksum none can be used to skip checksumming altogether. This is not recommended! In case files of the same size have contents that differ it is likely they are falsely consider duplicates, leading to file removal (depending on other options).

-buffersize N
    Chunksize in bytes when calculating the checksum for files, smaller or bigger can improve performance dependent on filesystem and checksum algorithm. The default is 1 MiB, the maximum allowed is 128MiB (inclusive).

-firstbytessize N
    Size in bytes when scanning the first bytes of each file, prior to full checksumming. Setting this to 0 means skipping the step entirely.

-lastbytessize N
    Size in bytes when scanning the last bytes of each file, prior to full checksumming. Setting this to 0 means skipping the step entirely.

-deterministic true|false
    If set (the default), sort files of equal rank in an unspecified but deterministic order. This makes the behaviour independent of in which order files are listed when querying the file system.

Action options:

-makesymlinks true|false
    Replace duplicate files with symbolic links. Default is false.

-makehardlinks true|false
    Replace duplicate files with hard links. Default is false.

-makeresultsfile true|false
    Make a results file in the current directory. Default is true. If the file exists, it is overwritten. This does not affect whether items are deleted. See -dryrun for how to disable deletions.

-outputname name
    Make the results file name to be "name" instead of the default results.txt.

-deleteduplicates true|false
    Delete (unlink) files. Default is false.

General options:

-progress true|false
    Show progress during elimination. Defaults to false.

-sleep Xms
    Sleeps X milliseconds between reading each file, to reduce load. Default is 0 (no sleep). Note that only a few values are supported at present: 0,1-5,10,25,50,100 milliseconds.

-n, -dryrun true|(false)
    By default, rdfind does nothing except creating a results file. In case one of the actions flags like -deleteduplicates is set, dryrun can be set to let rdfind print what it would do, instead of actually doing it. The default is false.

-h, -help, --help
    Displays a brief help message.

-v, -version, --version
    Displays the version number.

EXAMPLES

Search for duplicate files in the home directory and a backup directory:
    rdfind ~ /mnt/backup

Delete duplicates in a backup directory:
    rdfind -deleteduplicates true /mnt/backup

Search for duplicate files in directories called foo:
    find . -type d -name foo -print0 |xargs -0 rdfind

FILES
results.txt (the default name is results.txt and can be changed with option outputname, see above) The results file results.txt will contain one row per duplicate file found, along with a header row explaining the columns. A text describes why the file is considered a duplicate: DUPTYPE_UNKNOWN some internal error DUPTYPE_FIRST_OCCURRENCE the file that is considered to be the original. DUPTYPE_WITHIN_SAME_TREE files in the same tree (found when processing the directory in the same input argument as the original) DUPTYPE_OUTSIDE_TREE the file is found during processing another input argument than the original.

ENVIRONMENT

DIAGNOSTICS

EXIT VALUES
0 on success, nonzero otherwise.

BUGS/FEATURES
When specifying the same directory twice, it keeps the first encountered as the most important (original), and the rest as duplicates. This might not be what you want. The symlink creates absolute links. This might not be what you want. To create relative links instead, you may use the symlinks(8) command, which is able to convert absolute links to relative links. Older versions unfortunately contained a misspelling on the word occurrence. This is now corrected (since 1.3), which might affect user scripts parsing the output file written by rdfind.

SECURITY CONSIDERATIONS
Avoid manipulating the directories while rdfind is reading. rdfind is quite brittle in that case. Especially, when deleting or making links, rdfind can be subject to a symlink attack. Use with care! Rfind was written with the intention of deduplicating directories owned by the same user. It does not handle file ownership and permissions. It is not recommended to run it across directories with several owners.

AUTHOR
Paul Dreik 2006-2026, reachable at rdfind@pauldreik.se Rdfind can be found at https://rdfind.pauldreik.se/ Do you find rdfind useful? Drop me a line! It is always fun to hear from people who actually use it and what data collections they run it on.

THANKS
Several persons have helped with suggestions and improvements: Niels Möller, Carl Payne and Salvatore Ansani. Thanks also to you who tested the program and sent me feedback.

VERSION
1.8.0 (release date 2026-02-22)

COPYRIGHT
This program is distributed under GPLv2 or later, at your option.

SEE ALSO
md5sum, sha1sum, find, symlinks