Remove arquivos duplicados, mas somente se eles estiverem na mesma pasta?

4

Eu li o FAQ e sei que isso está perto de ser fechado como pedir uma recomendação de produto ...

Eu examinei pelo menos 40 utilitários de remoção de "arquivos duplicados" (Windows, OSX e Linux) e nenhum deles tem o recurso específico que estou procurando.

Eu preciso agora se houver algo lá fora que possa fazer isso ou se eu tiver que escrever minha própria ferramenta para isso.

Apenas uma resposta "Sim, existe" estaria bem para mim.
Isso significaria que eu simplesmente não pesquisei o suficiente.

Meu recurso necessário: Remover arquivos duplicados em uma estrutura de pastas grande, mas SOMENTE se as duplicatas residirem na mesma pasta.
Por exemplo. Digamos que eu tenha arquivos A, B e C idênticos. A e C estão na mesma pasta. B está em outra pasta. Tanto A quanto C precisam ser removidos (sem preferência), mas B deve ser deixado em paz.

Existe algo lá fora que pode fazer isso?
(De preferência, o Windows, mas o OS-X ou o Linux também está OK.)

    
por Tonny 05.09.2013 / 18:19

3 respostas

3

Você pode usar fdupes sem -r para não descer em subdiretórios. Isso imprime uma lista de arquivos duplicados:

find . -type d -exec fdupes -n {} \;

-n ignora arquivos vazios. Adicione -dN ( --delete --noprompt ) para excluir todos, exceto o primeiro arquivo duplicado.

Você pode instalar fdupes no OS X com brew install fdupes .

    
por 05.09.2013 / 20:27
5

Bem, como eu disse, trabalhei em um script Python que faz exatamente isso.

Hospedei-o no Google Code e já abri -forneceu como GPL v3, então eu suponho que qualquer um que queira melhorar o programa pode fazer isso.

Eu também depurei um pouco (criei dezenas de arquivos no Windows, deletei todos os originais). O código é altamente comentado para informar qualquer pessoa sobre o que o código realmente faz.

Eu o executei no Python 3.3, mas presumo que ele deva funcionar com o mais recente Python 2.

Ah, e a melhor parte, deve funcionar em qualquer suporte ao OS Python (Windows, OSX, Linux, ...)

    
por 05.09.2013 / 19:34
1

Esta é uma abordagem lenta, mas segura e muito simples, que deve ser executada tanto no OSX quanto no Linux. Estou assumindo que você está interessado em arquivos duplicados que residem no seu $HOME , mas você pode alterar isso para atender às suas necessidades.

A idéia é primeiro encontrar uma lista de todos os diretórios, então comparar os arquivos dentro deles e deletar quaisquer que sejam idênticos. Como eu disse, isso é muito simplista, então apenas manterá o primeiro de qualquer par de arquivos e excluirá o resto sem aviso prévio.

Isso imprimirá os enganos, mas não fará alterações nos seus arquivos:

find $HOME  -mindepth 1 -type d | while read dir; do 
  find $dir -type -f -exec md5sum {} \; | sort > md5sums;
  gawk '{print $1}' md5sums | sort | uniq -d > dupes;
  while read d; do 
    echo "---"; grep -w $d md5sums | cut -d ' ' -f 2-;
  done < dupes
done; rm dupes md5sum 

Este irá excluir silenciosamente os arquivos duplicados, somente executá-lo se tiver certeza de que está OK :

find $HOME  -mindepth 1 -type d | 
while read dir; do 
  find $dir -type -f -exec md5sum {} \; | sort > md5sums;
  gawk '{print $1}' md5sums | sort | uniq -d |
  while read d; do grep -w $d md5sums | cut -d ' ' -f 2- | tail -n +2; done |
  | xargs rm ; 
done; rm dupes md5sum 

CAVEATS: Isso é lento, na verdade SLOW, não emitirá avisos e excluirá os arquivos silenciosamente. No lado positivo, isso só acontecerá se esses arquivos estiverem no mesmo diretório que você deseja.

    
por 05.09.2013 / 19:07