Eu conheço 4 soluções de linha de comando para o Linux. A minha preferida é a última listada aqui, rdfind
, por causa de todas as opções disponíveis.
fdupes
- Este parece ser o mais recomendado / mais conhecido.
- É o mais simples de usar, mas sua única ação é excluir duplicatas.
- Para garantir que as duplicatas sejam realmente duplicadas (embora não demorem para serem executadas), as comparações entre os arquivos são feitas primeiro pelo tamanho do arquivo, depois pelo md5 hash e pela comparação bye by byte.
Exemplo de saída (com opções "show size", "recursive"):
$ fdupes -Sr .
17 bytes each:
./Dir1/Some File
./Dir2/SomeFile
hardlink
- Projetado para, como o nome indica, substituir arquivos encontrados por hardlinks.
- Possui uma opção
--dry-run
. - Não indica como o conteúdo é comparado, mas, ao contrário de todas as outras opções, leva em conta o modo de arquivo, o proprietário e o horário modificado.
Exemplo de saída (observe como meus dois arquivos têm tempos de modificação ligeiramente diferentes, portanto, na segunda execução, digo para ignorar isso):
$ stat Dir*/* | grep Modify
Modify: 2015-09-06 23:51:38.784637949 -0500
Modify: 2015-09-06 23:51:47.488638188 -0500
$ hardlink --dry-run -v .
Mode: dry-run
Files: 5
Linked: 0 files
Compared: 0 files
Saved: 0 bytes
Duration: 0.00 seconds
$ hardlink --dry-run -v -t .
[DryRun] Linking ./Dir2/SomeFile to ./Dir1/Some File (-17 bytes)
Mode: dry-run
Files: 5
Linked: 1 files
Compared: 1 files
Saved: 17 bytes
Duration: 0.00 seconds
duff
- Feito para encontrar arquivos em que o usuário age; não tem ações disponíveis.
- As comparações são feitas por tamanho de arquivo e, em seguida, sha1 hash.
- O hash pode ser alterado para sha256, sha384 ou sha512.
- O hash pode ser desativado para fazer uma comparação byte a byte
Exemplo de saída (com opção "recursiva"):
$ duff -r .
2 files in cluster 1 (17 bytes, digest 34e744e5268c613316756c679143890df3675cbb)
./Dir2/SomeFile
./Dir1/Some File
rdfind
- As opções têm uma sintaxe incomum (destinada a imitar
find
?). - Várias opções de ações para executar arquivos duplicados (excluir, criar links simbólicos, criar hardlinks).
- Tem um modo de funcionamento a seco.
- As comparações são feitas por tamanho de arquivo, primeiro bytes, depois bytes finais e, em seguida, md5 (padrão) ou sha1.
- A classificação de arquivos encontrados torna previsível qual arquivo é considerado o original.
Exemplo de saída:
$ rdfind -dryrun true -makehardlinks true .
(DRYRUN MODE) Now scanning ".", found 5 files.
(DRYRUN MODE) Now have 5 files in total.
(DRYRUN MODE) Removed 0 files due to nonunique device and inode.
(DRYRUN MODE) Now removing files with zero size from list...removed 0 files
(DRYRUN MODE) Total size is 13341 bytes or 13 kib
(DRYRUN MODE) Now sorting on size:removed 3 files due to unique sizes from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on md5 checksum:removed 0 files from list.2 files left.
(DRYRUN MODE) It seems like you have 2 files that are not unique
(DRYRUN MODE) Totally, 17 b can be reduced.
(DRYRUN MODE) Now making results file results.txt
(DRYRUN MODE) Now making hard links.
hardlink ./Dir1/Some File to ./Dir2/SomeFile
Making 1 links.
$ cat results.txt
# Automatically generated
# duptype id depth size device inode priority name
DUPTYPE_FIRST_OCCURRENCE 1 1 17 2055 24916405 1 ./Dir2/SomeFile
DUPTYPE_WITHIN_SAME_TREE -1 1 17 2055 24916406 1 ./Dir1/Some File
# end of file