Procura e Apaga arquivos duplicados com nomes diferentes

7

Eu tenho uma grande coleção de músicas armazenada no meu disco rígido; e navegando por ele, descobri que tenho muitos arquivos duplicados em alguns diretórios de álbuns. Geralmente as duplicatas existem ao lado do original no mesmo diretório.

Normalmente, o formato é filename.mp3 e o arquivo duplicado é nome do arquivo 1.mp3 . Às vezes, pode haver mais de um arquivo duplicado e não tenho idéia se há arquivos duplicados nas pastas (por exemplo, duplicatas de diretórios de álbuns).

Existe alguma maneira de verificar esses arquivos duplicados (por exemplo, comparando o tamanho do arquivo ou comparando os arquivos inteiros para verificar se eles são idênticos), revisar os resultados e, em seguida, excluir os duplicados? Os que têm um nome mais longo ou aqueles que têm uma data modificada / criada mais recente normalmente seriam os alvos da exclusão.

Existe algum programa que possa fazer isso no Linux?

    
por Cestarian 06.05.2015 / 14:46

4 respostas

11

Existe um programa desse tipo e é chamado rdfind :

SYNOPSIS
   rdfind [ options ] directory1 | file1 [ directory2 | file2 ] ...

DESCRIPTION
   rdfind  finds duplicate files across and/or within several directories.
   It calculates checksum only if necessary.  rdfind  runs  in  O(Nlog(N))
   time with N being the number of files.

   If  two  (or  more) equal files are found, the program decides which of
   them is the original and the rest are considered  duplicates.  This  is
   done  by  ranking  the  files  to each other and deciding which has the
   highest rank. See section RANKING for details.

Ele pode excluir as duplicatas ou substituí-las por links simbólicos ou físicos.

    
por 06.05.2015 / 18:26
10

Hmmph. Eu acabei de desenvolver um one-liner para listar todos os duplicados, para um pergunta que acabou por ser uma duplicata disso. Como meta. Bem, É uma pena desperdiçá-lo, então vou postá-lo, apesar de rdfind soar melhor solução.

Isso pelo menos tem a vantagem de ser a maneira "real" do Unix de fazê-lo;)

find -name '*.mp3' -print0 | xargs -0 md5sum | sort | uniq -Dw 32

Quebrando o canal:

find -name '*.mp3' -print0 encontra todos os arquivos mp3 na subárvore começando no diretório atual, imprimindo os nomes separados por NUL.

xargs -0 md5sum lê a lista separada por NUL e calcula uma soma de verificação em cada arquivo.

Você sabe o que sort faz.

uniq -Dw 32 compara os primeiros 32 caracteres das linhas classificadas e imprime apenas os que têm o mesmo hash.

Então você acaba com uma lista de todos os duplicados. Você pode então cortar manualmente para os que você deseja excluir, remova os hashes e canalize a lista para rm .

    
por 30.11.2015 / 02:25
2

Fico feliz que você tenha terminado o trabalho com rdfind .

Na próxima vez, você também poderá considerar rmlint . É extremamente rápido e oferece algumas opções diferentes para ajudar a determinar qual arquivo é o original em cada conjunto de duplicados.

    
por 07.05.2015 / 15:23
2

Eu estaria pensando em usar o Perl:

#!/usr/bin/perl
use strict;
use warnings;

use File::Find;
use Digest::SHA qw ( sha1_hex );

my %seen;

sub find_dupes {
    next if -d;
    local $/;
    open( my $input, "<", $File::Find::name ) or warn $!;
    my $sha1sum = sha1_hex(<$input>);
    close($input);
    if ( $seen{$sha1sum} ) {
        print "$File::Find::name is probably a dupe of $seen{$sha1sum} - both have $sha1sum\n";
    }
    $seen{$sha1sum} = $File::Find::name;
}

find( \&find_dupes, "/path/to/search", "/another/path/to/search" );
    
por 06.05.2015 / 18:57