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

15

Eu encontrei este comando usado para encontrar arquivos duplicados, mas foi bastante longo e me deixou confuso. Por exemplo, se eu remover -printf "% s \ n", nada saiu. Por que 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
    
por The One 20.04.2016 / 04:46

3 respostas

21

Você pode diminuir:

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

Execute md5sum dos arquivos encontrados na ação -exec de find e, em seguida, sort e uniq para obter os arquivos com os mesmos md5sum separados por nova linha.

    
por 20.04.2016 / 06:42
27

Você pode usar fdupes . De man fdupes :

Searches the given path for duplicate files. Such files are found by comparing file sizes and MD5 signatures, followed by a byte-by-byte comparison.

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

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

    
por 20.04.2016 / 06:28
9

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.

    
por 20.04.2016 / 12:40