Compare arquivos com checksum em relação ao caminho uns dos outros?

0

Eu mesclei vários backups de todos os meus arquivos de fotografia e deparei com várias cópias de muitos arquivos. Nem todos os arquivos são cópias e alguns são photoshopados. Agora notei 'fdupes' que podem me ajudar a identificar duplicatas e excluir cada uma delas.

Agora há um problema.

Digamos que eu tenha essa estrutura de pastas:

/Photoshoot X copy 1/*
/Photoshoot X copy 1/selection/*

/Photoshoot X copy 2/*
/Photoshoot X copy 2/selection/*

Muitos, senão todos, os arquivos em copy 2 são duplicatas daqueles em copy 1 . Aqueles podem ser deletados. Contudo! Alguns, se não todos, os arquivos dentro da pasta selection são duplicatas diretas daquelas encontradas na pasta raiz. Aqueles devem ser não excluídos, mesmo que sejam duplicatas. Eles não devem ser excluídos porque, apesar de serem duplicados, são copiados porque são os mais importantes de toda a coleção.

Agora minha pergunta: é possível comparar arquivos em lote em relação ao caminho?

Assim, apenas as duas pastas raiz são comparadas, não a pasta raiz em comparação com o conteúdo da pasta selection .

    
por Sander Schaeffer 24.03.2016 / 15:12

2 respostas

1

Em um ambiente Linux, pode-se instalar fdupes

Passo 1, obtenha uma lista de arquivos duplicados

fdupes -f basedirectory/ > list.txt

Etapa 2, filtre as duplicatas nos diretórios /selection/

grep -v "/selection/" list.txt > script.sh

Etapa 3: faça script.sh em um script para excluir os arquivos usando a pesquisa global e substitua para colocar um comando de exclusão, rm no início de cada linha. Use o seu editor de texto favorito, ou sed se você se sentir bem. Verifique seu trabalho aqui, estes são os arquivos que desaparecem. Tome cuidado se você tiver nomes de arquivo com espaços ou outros caracteres especiais neles. Você pode ter que colocar um rm " no início da linha e um " no final para contornar isso.

perl -p -i -e 's/^(.*)$/rm ""/' script.sh

deve funcionar, mas confira o arquivo depois antes de executar para ter certeza de que é o que você quer.

O passo 4 executa seu novo script. Isso está puxando o gatilho.

sh -x script.sh

Etapa 5: limpe-se eliminando os arquivos temporários list.txt e script.sh

Sem dúvida, poder-se-ia modificar o fluxo de trabalho para a linha de comando do Windows com subsituições adequadas.

    
por 24.03.2016 / 16:45
1

Execute o script perl findDups.pl abaixo no seu mac (substituindo dir_to_scan pelo diretório para procurar por duplicatas):

$ findDups.pl dir_to_scan > rmdups.sh

dê uma olhada final no script rmdups.sh antes de executá-lo com:

$ sh rmdups.sh

#!/usr/bin/perl
# Usage: findDups.pl dir_to_scan
use strict;
use warnings;
use File::Find 'find';
use Digest::MD5 'md5';

my $dir = shift @ARGV || '.';
my %files;

find(\&wanted, $dir);

sub wanted {
  my $localname = $_;
  my $path = $File::Find::name;
  return if $path =~ m#/selection/#;
  return unless -f $localname;
  my $md5 = md5($localname);
  push(@{$files{$md5}}, $path);
}

while (my($key, $value) = each(%files)) {
  while (@{$files{$key}} > 1) {
    my $doomed = shift @{$files{$key}};
    print 'rm \'' . $doomed . '\'' . $/;
  }
}
    
por 24.03.2016 / 17:44

Tags