CLI AI

Encontrar arquivos duplicados na linha de comando do Linux

2026-06-13

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
$ 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
$ 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
$ 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
$ 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
$ 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
$ 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

CliAI não hasheia seus arquivos pra você, mas evita que você reinvente o flag uniq -w32 toda vez. Instale em uma linha.