Acabei de encontrar esse "gem" em um antigo histórico bash e, na verdade, funciona sem tropeçar em espaços em branco em nomes de arquivos.
Comparação de conteúdo
for hash in 'find . -exec md5sum {} \; 2>/dev/null | sort | awk '{ print $1 }' | uniq -d'; do
find . -exec md5sum {} \; 2>/dev/null | grep $hash | awk '{print $2 }';
done;
informal:
- Primeira linha: percorra a árvore de diretórios e calcule o md5sum de todos os arquivos abaixo, classifique essa saída (formato: hash filename), pegue a coluna hash, reduza para valores duplicados. (significa que há duplicatas)
- Segunda linha: para cada um dos hashes de duas ocorrências, percorra novamente e imprima o nome do arquivo se o arquivo atual tiver o hash atual (significa que o arquivo é múltiplo)
Exemplo de saída
:
./aFile
./aFolder/aFile
./1000digitsOfPI
./a/b/c/thousanddigitsofPI
./b File
./bFolder/cFolder/b File
A remoção não está implementada aqui porque pode ser difícil decidir qual versão dos arquivos duplicados você deseja manter.
Comparação com nome de arquivo
Se você quiser apenas ver nomes de arquivos e não conteúdos, fica ainda mais fácil:
for name in 'find . -type f -printf "%f\n" | sort | uniq -d'; do
find . -name $name;
done;
Atualização: Infelizmente esta versão está quebrando com espaços em branco em nomes de arquivos novamente.