Como encontrar arquivos mais comuns ou freqüentes no diretório?

1

Eu tenho um diretório com muitas imagens (mais de 100.000). Muitos destes são duplicatas / imagens idênticas, mas obviamente todos têm nomes de arquivos diferentes. Eu preciso encontrar as imagens que têm mais duplicatas neste diretório. Por exemplo, o arquivo1.jpeg tem 120 duplicatas, o arquivo2.jpeg tem 90 duplicatas, etc.

Eu estava pensando em obter o md5 de cada arquivo e fazer algum tipo de classificação, mas estou confuso nos detalhes. Isso pode ser feito com um script de shell?

Para deixar claro, não preciso remover duplicatas (ainda), preciso descobrir quais arquivos têm mais cópias.

Estou no OS X se isso ajudar.

    
por Jonathan Knight 04.10.2010 / 23:06

2 respostas

0

Se os arquivos forem duplicados exatos, o pós-processamento da saída de shasum * | sort provavelmente ajudará. Salve-o em um arquivo, pois o cálculo pode demorar um pouco e você provavelmente precisará dele mais de uma vez:

shasum * | sort >/tmp/shasums

Por exemplo, para ver a propagação de arquivos idênticos (com apenas somas de verificação, não nomes de arquivos):

</tmp/shasums cut -d ' ' -f 1 | uniq -c

Aqui está uma maneira de ver os nomes dos arquivos e as contagens duplicadas:

</tmp/shasums sed 's/ .*//' | uniq -c - | join -1 2 - /tmp/shasums | sort -k 2,1

Sem o GNU uniq, não tenho nada melhor para oferecer para mostrar os nomes dos arquivos de uma maneira agradável do que o seguinte script Perl:

</tmp/shasums perl -lne '
    s/^([^ ]*?)  //; # set $1 to the checksum and $2 to the filename
    push @{$names{$1}}, $_; # dispatch file names by checksum
    END {
        # iterate through the checksums, sorted by repeat count
        foreach (sort {@$a <=> @$b} values %names) {
            # print the repeat count and the file names
            printf "%d %s\n", scalar(@$_), join(" ", @$_)
        }
    }'
    
por 05.10.2010 / 00:05
1

Este é um pipeline rápido e sujo que irá imprimir nomes de duplicatas entre as linhas de hífens. Ele procura apenas no diretório atual, mas você pode usar find para fazer uma pesquisa recursiva.

md5sum *.jpeg | sort | awk '{if ($1 != prev) print "-----"; print $2; prev = $1}'

Exemplo de saída:

-----
unique1.jpeg
-----
dup1.jpeg
dup2.jpeg
dup3.jpeg
-----
same1.jpeg
same2.jpeg
-----
solo1.jpeg
    
por 04.10.2010 / 23:36

Tags