desenv-web-rp.com

Qual é a maneira mais rápida de encontrar arquivos duplicados?

Eu encontrei esse comando usado para encontrar arquivos duplicados, mas foi bastante longo e me deixou confusa. Por exemplo, se eu remover -printf "% s\n", nada saiu. Porque foi isso? Além disso, por que eles usaram xargs -I {} -n1? Existe alguma maneira mais fácil de encontrar arquivos duplicados?

[4a-o07-d1:root/798]#find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
0bee89b07a248e27c83fc3d5951213c1  ./test1.txt
0bee89b07a248e27c83fc3d5951213c1  ./test2.txt
30
The One

Você pode torná-lo mais curto:

find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD

Faz md5sum dos arquivos encontrados no -exec ação de find e, em seguida, sort e faça uniq para obter os arquivos com a mesma md5sum separados por nova linha.

45
heemayl

Você pode usar fdupes . De man fdupes:

Pesquisa o caminho especificado para arquivos duplicados. Esses arquivos são encontrados através da comparação de tamanhos de arquivo e assinaturas MD5, seguidos por uma comparação de byte a byte.

Você pode chamá-lo como fdupes -r /path/to/dup/directory e imprimirá uma lista de dupes.

Atualização

Você pode tentar também fslint . Depois de configurar o fslint, vá para cd /usr/share/fslint/fslint && ./fslint /path/to/directory

39
Rahul

Caso você queira entender o comando original, vamos passo a passo.

find -not -empty -type f

Localize 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ê descartar esses argumentos, ele imprimirá caminhos, interrompendo as etapas subseqüentes.

 | sort -rn

Classificar numericamente (-n), Em ordem inversa (-r). Porém, classificar em ordem crescente e comparar como cadeias de caracteres e não números também deve funcionar tão bem, então você pode soltar o -rn bandeiras.

 | uniq -d

Procure por 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, em vez de passar várias entradas para uma única chamada.

   find -type f -size {}c -print0

Este é o comando a ser executado para cada tamanho: Encontre arquivos no diretório atual que correspondam a esse tamanho, dados em caracteres (c) ou mais precisamente em bytes. Imprima todos os nomes de arquivos correspondentes, separados por bytes nulos em vez de novas linhas, para que os nomes de arquivos que contêm novas linhas sejam tratados corretamente.

 | xargs -0 md5sum

Para cada um desses nomes separados por nulo, calcule a soma de verificação MD5 do referido 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 as linhas que concordam em seus primeiros 32 bytes (a soma de verificação; depois disso vem o nome do arquivo). Imprima todos os membros dessas execuções de duplicatas, com execuções distintas separadas por novas linhas.

Comparado a o comando mais simples sugerido por heemayl , isso tem o benefício de que apenas arquivos de soma de verificação têm outro arquivo do mesmo tamanho. Ele paga por isso com repetidas invocações find, percorrendo a árvore de diretórios várias vezes. Por esses motivos, esse comando é particularmente adequado para diretórios com poucos, mas grandes arquivos, uma vez que, nesses casos, evitar uma chamada de soma de verificação pode ser mais importante do que evitar o deslocamento repetido da árvore.

15
MvG