Para encontrar arquivos duplicados no Linux pela linha de comando sem instalar nada, calcule o md5 de cada arquivo e deixe o uniq marcar as repetições: find d -type f -exec md5sum {} + | sort | uniq -w32 -dD. Quase todo resultado de busca é review de ferramenta que você precisa instalar antes — fdupes, rdfind, rmlint. Num servidor que não é seu ou num container descartável, muitas vezes não dá pra instalar nada. Abaixo vai um pipeline feito só com o que já vem no sistema, mais o limite honesto de quando vale instalar uma ferramenta de verdade.
1. Duplicados pelo conteúdo, sem instalar pacotes
$ clai encontre arquivos com o mesmo conteúdo na pasta d→ find d -type f -exec md5sum {} + | sort | uniq -w32 -dD4f784201526479699db75d69c7abad6d d/a/one.txt4f784201526479699db75d69c7abad6d d/b/two-copy.txt
uniq -w32 compara só os primeiros 32 caracteres da linha — exatamente o tamanho de um hash md5, então a comparação é pelo conteúdo, não pelo nome. -d deixa só as repetições, -D imprime todas as linhas do grupo, não só uma.
2. Conte antes de decidir
$ clai quantos grupos de duplicados existem no total→ find d -type f -exec md5sum {} + | sort | uniq -w32 -d | wc -l
Uma linha por grupo. Se são três grupos, dá pra olhar. Se são três mil, precisa de uma ferramenta com modo interativo, não de um pipeline.
3. Não hasheie terabytes à toa
$ clai encontre duplicados só entre arquivos maiores que 10 megabytes→ find . -type f -size +10M -exec md5sum {} + | sort | uniq -w32 -dD
md5 lê o arquivo inteiro. Numa árvore grande, filtrar por tamanho primeiro acelera tudo em uma ordem de grandeza — e são os arquivos grandes que ocupam espaço mesmo.
4. Mais rápido: primeiro tamanho, depois hash
$ clai encontre duplicados rápido, filtrando primeiro por tamanho→ find . -type f -printf '%s\n' | sort -n | uniq -d | while read s; do find . -type f -size "${s}c" -exec md5sum {} + ; done | sort | uniq -w32 -dD
Arquivos de tamanhos diferentes não podem ser duplicados. Só são hasheados os que batem em tamanho. Numa árvore com um milhão de arquivos, isso é a diferença entre minutos e horas.
5. Deixe uma cópia de cada grupo
$ clai mostre quais duplicados dá pra apagar, deixando uma cópia de cada→ find . -type f -exec md5sum {} + | sort | uniq -w32 -d --all-repeated=separate | awk 'seen[$1]++ {print $2}'
awk 'seen[$1]++' pula a primeira ocorrência de cada hash e imprime todas as seguintes — a lista de candidatos a apagar. É uma lista pra ler, não pra jogar direto em xargs rm. Leia ela.
6. Quando vale instalar uma ferramenta de vez
$ clai encontre duplicados e deixe eu apagar de forma interativa→ fdupes -r -d .
Se são centenas de grupos e você quer ser perguntado em cada um, fdupes -d pergunta o que manter. rdfind consegue substituir duplicados por hard links sem apagar nada. O pipeline acima é pra onde não dá pra instalar pacote nenhum.
Pegadinhas
- md5 basta pra achar duplicados, mas não serve pra segurança. Uma colisão de md5 pode ser construída de propósito; por acaso, não acontece. Pra checar integridade use sha256; pra achar cópias, md5 é mais rápido e já resolve.
- Hard links parecem duplicados. O mesmo arquivo com dois nomes dá o mesmo hash, mas ocupa espaço só uma vez. Filtre pelo número do inode:
find . -type f -printf '%i %p\n' | sort -u -k1,1. - Nunca jogue a lista direto no rm. Um filtro errado e você apaga as duas cópias. Salve a lista num arquivo, leia, só depois apague.
Perguntas relacionadas
Como acho duplicados pelo nome em vez do conteúdo? find . -type f -printf '%f\n' | sort | uniq -d mostra nomes que se repetem em diretórios diferentes.
Isso funciona no macOS? Troque md5sum por md5 -r — o formato de saída bate certinho. O -printf do find também precisa virar -exec stat -f.
O que é mais rápido pra centenas de milhares de arquivos? A abordagem da seção 4, ou o rdfind, que ordena por inode antes de tocar no disco.
Veja também
- Qual pasta está comendo o disco? du, ordenado do maior pro menor
- df diz que o disco está cheio, du diz que não
- Pare de decorar flags do find
CliAI não hasheia seus arquivos pra você, mas evita que você reinvente o flag uniq -w32 toda vez. Instale em uma linha.