Como limpar duplicatas existentes em uma pasta de outra recursivamente?

4

Resumo: A pasta A tem apenas muitos arquivos Excelent A pasta B tem muitas pastas de arquivos Excelent / Good / Bad misturados Como posso excluir arquivos nas pastas da pasta B somente no caso de eles estarem na pasta A. Ou simplesmente colocando a mesma coisa: Como fazer a verificação dos arquivos da pasta A, se eles existirem nas pastas da pasta B e, em seguida, excluir das pastas da pasta B?

Idéia da solução Talvez uma bruxa de comando:

  1. Verifica parte do alfabeto como tudo começando com A
  2. Execução de exclusão em arquivos encontrados em subpastas da pasta B
  3. Repetir 1. + um alfabeto para cima.

Porque os programas de duplicação eram ruins:

  1. Muito tempo até a primeira exclusão - é só quando terminar de digitalizar
  2. E não é possível escolher excluir na pasta B. É possível apenas manter as últimas e outras coisas também, mas não escolhendo na pasta da bruxa para manter.

Histórico inútil: Os arquivos foram copiados do Recuva na Pasta B e parcialmente arranjados, mas muitos deles são ruins, então eu estou pensando na Pasta B comparando se existe para a bruxa recuperada novamente, mas agora apenas Excelent recuperada Na pasta A por Recuva, a maioria dos Excelent será apenas na pasta A.

Árvore de arquivos de exemplo:

.
├── A
│   ├── 1.png
│   ├── 2.png
│   └── Excellent
│       ├── e1.png
│       └── e2.png
└── B
    ├── 1.png
    ├── 2.png
    ├── Bad
    │   ├── 1.png
    │   ├── 2.png
    │   ├── e1.png
    │   └── e2.png
    └── Excellent
        ├── e1.png
        └── e2.png
    
por Kangarooo 06.01.2013 / 03:18

1 resposta

6

Abaixo estão duas soluções, dependendo de como definimos "duplicado":

  • Arquivos com o mesmo caminho relativo ou
  • Arquivos com o mesmo conteúdo, mas não necessariamente com o mesmo nome

Se por "duplicado" queremos dizer dois arquivos que compartilham o mesmo caminho relativo , você pode usar find e xargs para remover as duplicatas. Por exemplo, suponha que você tenha

~/tmp% tree A
A
└── Excellent
    ├── bar
    ├── baz
    └── foo
~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
│   ├── bar
│   ├── baz
│   └── foo
└── Good

Então

find /home/unutbu/tmp/A  -depth -type f -print0 | xargs -0 -I{} bash -c 'rm "/home/unutbu/tmp/B${1#*A}"' - {}

resulta em

~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
└── Good

Ou, se por "duplicado" queremos dizer que dois arquivos compartilham o mesmo conteúdo , embora talvez não seja o mesmo nome de arquivo, você pode usar rdfind :

sudo apt-get install rdfind

Se tivermos essa estrutura de diretório:

~/tmp% tree A
A
└── Excellent
    ├── bar
    ├── baz
    └── foo

1 directory, 3 files
~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
│   ├── barbar
│   ├── bazbaz
│   └── foofoo
└── Good

em que barbar tem o mesmo conteúdo que bar e, da mesma forma, para bazbaz e foofoo , então

rdfind -deleteduplicates true A B

resulta em

~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
└── Good

Solução alternativa caso sua versão do Ubuntu não inclua rdfind:

Você poderia usar fdupes :

sudo apt-get install fdupes
fdupes --recurse --delete --noprompt A B 
    
por unutbu 06.01.2013 / 05:05