Programa para remover arquivos duplicados exatos ao armazenar em cache os resultados da pesquisa

1

Precisamos de um programa do Windows 7 para remover / verificar as duplicatas, mas nossa situação é um pouco diferente da padrão para a qual existem programas suficientes.

Temos um arquivo estático bastante grande (coleção) de fotos espalhadas em vários discos. Vamos chamá-los de disco A..M. Temos também alguns discos (vamos chamá-los de Disco 1..9) que contêm algumas duplicatas que podem ser encontradas nos discos A..M.

Queremos adicionar à nossa coleção novos discos (N, O, P ... aso.) que conterão as fotos dos discos 1..9 mas, claro, não queremos ter nenhuma foto dois (ou mais) vezes.

Naturalmente, teoricamente, a tarefa pode ser resolvida com um removedor de duplicata de arquivo regular, mas o tempo necessário será muito grande.

Idealmente, AFAIS agora, a solução real seria um programa que varreria os discos A..M, armazenaria os tamanhos de arquivo / hashes das fotos em um banco de dados / arquivo indexado (s) e verificaria a novos discos (1..9) contra este banco de dados.

No entanto, tenho dificuldade em encontrar um programa desse tipo (se existir).

Outras coisas a notar:

  • consideramos que os Discos A..M (a coleção) não tem duplicatas neles
  • os nomes dos arquivos podem ser alterados
  • não estamos interessados em comparação aproximada (difusa) que pode ser encontrada em algumas fotos comparando programas. Buscamos arquivos duplicados exatos .
  • não temos medo da linha de comando. : -)
  • precisamos trabalhar no Win7 / XP
  • nós preferimos (é claro) ser freeware
por John Thomas 09.07.2012 / 11:14

2 respostas

2

Com base na solução de Dennis, decidimos usar o pacote hashdeep , que também está disponível no Windows.

Uso básico:

Etapa 1. Gerar os hashes (isso deve ser feito apenas uma vez)

hashdeep64 -c tiger -r "D:\*" > Disk_D.hash

Nós usamos o tigre como uma função hash - mais rápido e melhor que o SHA-1 ( sem colisões).

Passo 2: Procure por duplicatas (isso deve ser executado para cada unidade / diretório para verificar)

hashdeep64 -k Disk_D.hash -m -r "E:\My-Dir-To-Check\*" > Dupes.txt

Agora, todas as duplicatas são armazenadas em Dupes.txt

Você pode usar o MsWord, o LibreOffice ou o Notepad ++ (ou qualquer outra maneira que você saiba) para inserir del (e / ou qualquer outra opção) neste arquivo de texto para deletar os arquivos. Você tem aqui variações suficientes, incluindo um arquivo .bat simples que varre a lista de arquivos para excluir todas as entradas.

Além disso, você tem a opção de revisar a lista de arquivos e fazer o processamento manualmente.

    
por 11.07.2012 / 11:21
2

Aproach

  1. Escolha uma função de hash livre de colisões.

    Meu exemplo usa o SHA1, já que o gargalo será o disco rígido de qualquer maneira.

    Se isso levar muito tempo, seria possível comparar apenas o primeiro megabyte dos arquivos. Isso deve ser suficiente para imagens.

  2. Leia os arquivos de interesse nos discos A..M, calcule seus hashes e armazene-os em um arquivo específico para esse disco (para que você possa adicionar / remover discos posteriormente).

  3. Leia os arquivos de interesse nos discos 1..9 e calcule seus hashes.

    Se o hash de um arquivo já é conhecido, execute uma ação (listar ou excluir).

Configuração

  1. Faça o download e instale o Cygwin , uma coleção de ferramentas que fornecem um ambiente de aparência e comportamento do Linux para o Windows.

  2. No Windows Explorer, abra a pasta %ProgramFiles(x86)%\Cygwin\home\%USERNAME% .

  3. Edite o arquivo .bashrc e anexe a seguinte linha:

    export PATH=~:$PATH
    
  4. Crie um arquivo chamado hashdrive e salve o seguinte código:

    #!/bin/bash
    
    DRIVELETTER=$(echo $1 | tr '[:upper:]' '[:lower:]')
    EXTENSIONS=$(echo $2 | sed 's/,/\|/g')
    DRIVENAME=$(echo $3 | tr '[:upper:]' '[:lower:]')
    
    set -e
    [ -d /cygdrive/$DRIVELETTER ] || (echo "Drive $DRIVELETTER: does not exist." ; exit 1)
    [ -f ~/drives/$DRIVENAME ] && (echo "Hashfile for drive $DRIVENAME already exists." ; exit 1)
    set +e
    
    mkdir ~/drives 2>/dev/null
    find /cygdrive/$DRIVELETTER -type f -iregex ".*\.\($EXTENSIONS\)" -exec sha1sum {} \; | cut -b -40 > ~/drives/$DRIVENAME
    
  5. Crie um arquivo chamado checkdrive e salve o seguinte código:

    #!/bin/bash
    
    DRIVELETTER=$(echo $1 | tr '[:upper:]' '[:lower:]')
    EXTENSIONS=$(echo $2 | sed 's/,/\|/g')
    ACTION=$(echo $3 | tr '[:upper:]' '[:lower:]')
    
    set -e
    [ -d /cygdrive/$DRIVELETTER ] || (echo "Drive $DRIVELETTER: does not exist." ; exit 1)
    set +e
    
    IFS=":" ; for FILE in 'find /cygdrive/$DRIVELETTER -type f -iregex ".*\.\($EXTENSIONS\)" -printf %p:'; do
        [ "$(grep -m 1 $(sha1sum "$FILE" | cut -b -40) ~/drives/*)" ] && $ACTION "$FILE"
    done
    

Uso

  • Para salvar os hashes de todas as imagens de um determinado disco em um arquivo, inicie o Cygwin e execute o seguinte comando:

    hashdrive DRIVELETTER EXTENSIONS DRIVENAME
    

    Por exemplo, se o DiskA estiver montado como a unidade D: e você quiser hash todas as imagens com as extensões jpg e png , use o seguinte comando:

    hashdrive d jpg,png diska
    

    Deve haver não espaço em jpg,png .

  • Para verificar um disco em busca de imagens duplicadas, inicie o Cygwin e execute o seguinte comando:

    hashdrive DRIVELETTER EXTENSIONS ACTION
    

    Por exemplo, se Disk1 estiver montado como unidade E: e você quiser listar todas as imagens duplicadas com as extensões jpg e png , use o seguinte comando:

    checkdrive e jpg,png echo
    

    Se você quiser remover os arquivos diretamente, use rm em vez de echo .

  • Para remover um disco do banco de dados, basta excluir o arquivo DRIVENAME na pasta %ProgramFiles(x86)%\Cygwin\home\%USERNAME%\drive .

Cuidado

O comando rm não move os arquivos para a Lixeira; elimina-os diretamente.

Embora seja possível recuperar os arquivos mesmo assim, tenha cuidado ao usar a ação rm e tente echo antes de usar rm .

    
por 10.07.2012 / 23:16