Caso você queira entender o comando original, vamos embora passo a passo.
find -not -empty -type f
Encontre todos os arquivos não vazios no diretório atual ou em qualquer um de seus subdiretórios.
-printf "%s\n"
Imprima seu tamanho. Se você eliminar esses argumentos, ele imprimirá os caminhos, quebrando as etapas subsequentes.
| sort -rn
Ordena numericamente ( -n
), na ordem inversa ( -r
). Classificar em ordem crescente e comparar como strings e não números deve funcionar tão bem, assim, você pode descartar os -rn
flags.
| uniq -d
Procure linhas consecutivas duplicadas e mantenha apenas essas.
| xargs -I{} -n1
Para cada linha de entrada (ou seja, cada tamanho que ocorre mais de uma vez), execute o seguinte comando, mas substitua {}
pelo tamanho. Execute o comando uma vez para cada linha de entrada, ao contrário de passar várias entradas para uma única invocação.
find -type f -size {}c -print0
Este é o comando a ser executado para cada tamanho: Localize os arquivos no diretório atual que correspondem a esse tamanho, dados em caracteres ( c
) ou bytes mais precisos. Imprima todos os nomes de arquivos correspondentes, separados por bytes nulos em vez de novas linhas, para que nomes de arquivos que contenham novas linhas sejam tratados corretamente.
| xargs -0 md5sum
Para cada um desses nomes separados por nulo, calcule a soma de verificação MD5 do dito arquivo. Desta vez, permitimos passar vários arquivos para uma única invocação de md5sum
.
| sort
Classifique por somas de verificação, pois uniq
considera apenas linhas consecutivas.
| uniq -w32 --all-repeated=separate
Encontre linhas que concordem em seus primeiros 32 bytes (a soma de verificação; depois disso vem o nome do arquivo). Imprima todos os membros de tais execuções de duplicatas, com execuções distintas separadas por novas linhas.
Em comparação com o o comando mais simples sugerido pelo heemayl , isso tem o benefício de apenas arquivos de checksum que têm outro arquivo do mesmo tamanho. Ele paga por isso com invocações find
repetidas, percorrendo a árvore de diretórios várias vezes. Por essas razões, este comando é particularmente adequado para diretórios com poucos, mas grandes arquivos, já que, nesses casos, evitar uma chamada de soma de verificação pode ser mais importante do que evitar repetidas travessias de árvore.