Como comparar dois diretórios e excluir arquivos duplicados

3

Como posso pesquisar dois diretórios por arquivos com o mesmo nome, tamanho, tipo ... e removê-los de um desses diretórios?

    
por fatemeh ghanbari 04.02.2018 / 12:54

6 respostas

1

Tomei um exemplo de dois diretórios p1 e p2

Primeiro, salvarei a saída dos nomes dos arquivos dos diretórios p1 e p2 em 2 arquivos de saída

find /root/p1 -type f |awk -F "/" '{print $NF}'   > /var/tmp/P1_file.txt

 find /root/p2 -type f |awk -F "/" '{print $NF}'   > /var/tmp/P2_file.txt

Agora eu vou encontrar os nomes de arquivos comuns em ambos os diretórios e excluir em um dos diretórios. Desejo que você apague os arquivos duplicados em / root / p1 e mantenha os arquivos em / root / p2

awk 'NR==FNR {a[$1];next}($1 in a) {print $1}' /var/tmp/P1_file.txt /var/tmp/P2_file.txt  |awk '{print "rm -rvf" " " "/root/p1/"$1}' | sh

Testado e trabalhado bem

    
por 04.02.2018 / 17:04
4

Usando fdupes :

fdupes --delete dir1 dir2

fdupes não testará o nome do arquivo ou o tipo de arquivo, mas testará o tamanho e o conteúdo do arquivo (que inclui implicitamente o tipo de arquivo).

Exemplo:

$ mkdir dir1 dir2

$ touch dir{1,2}/{a,b,c}

$ tree
.
|-- dir1
|   |-- a
|   |-- b
|   '-- c
'-- dir2
    |-- a
    |-- b
    '-- c

2 directories, 6 files

$ fdupes --delete dir1 dir2
[1] dir1/a
[2] dir1/b
[3] dir1/c
[4] dir2/a
[5] dir2/b
[6] dir2/c

Set 1 of 1, preserve files [1 - 6, all]: 1

   [+] dir1/a
   [-] dir1/b
   [-] dir1/c
   [-] dir2/a
   [-] dir2/b
   [-] dir2/c

$ tree
.
|-- dir1
|   '-- a
'-- dir2

2 directories, 1 file
    
por 04.02.2018 / 13:13
2

Sugiro que você use dircmp , que existe em muitos Unixes.

Veja:

man dircmp

A opção -d parece ser a que você pode achar mais adequada:

dircmp -d dir1 dir2

irá comparar o conteúdo de dir1 e dir2 e exibirá uma saída semelhante a diff .

    
por 04.02.2018 / 13:18
1

Você tem muitas opções para sua tarefa. Em vez de repetir as recomendações daqueles que responderam antes de mim, adicionarei uma com uma aparência diferente e com a qual você possa se sentir mais confortável.

Se você se sentir à vontade usando midnight commander , que é um gerenciador de arquivos de painel duplo baseado em ncurses para o console, esse programa inclui um recurso de comparação de diretório gráfico.

O procedimento para usá-lo é começar com cada diretório visível em um painel e depois pressionar C-x d (a atadura de teclado padrão) ou F9 c c (as atalhos padrão para o item de menu).

Aqui está um trecho redigido da página mc man que descreve o comando e seus três modos de operação:

  The "Compare directories" command compares the directory panels with
  each other. You can then use the Copy (F5) command to make the panels
  identical. There are three compare methods. The quick method compares
  only file size and file date. The thorough method makes a full
  byte-by-byte compare. The size-only compare method just compares the
  file sizes and does not check the contents or the date times, it just
  checks the file size.

Quando a comparação terminar, mc selecionará e exibirá visualmente os arquivos exclusivos do diretório atual. Assim, pressionar F5 irá copiá-los para o outro painel. Para excluir os arquivos comuns aos dois diretórios, pressione * para alternar a seleção (e observe como mc realça o inverso do que foi realçado antes) e pressione F8 para excluir.

    
por 04.02.2018 / 13:47
0

Percebi que você marcou sua pergunta como ubuntu , que normalmente vem com uma área de trabalho gráfica, por isso aqui estão algumas opções de área de trabalho gráfica:

1) Se você estiver usando o gerenciador de arquivos nautillus , existe um pacote ubuntu chamado nautilus-compare que integra uma comparação de diretório no gerenciador de arquivos que você já usa.

2) Existe também um programa independente chamado meld que realiza comparações de arquivos e diretórios.

    
por 04.02.2018 / 14:03
0

rmlint tem opções para fazer isso:

rmlint -T duplicates --match-basename --keep-all-tagged --must-match-tagged /duplicates // /originals

(o separador '//' identifica caminhos "marcados" para os switches - keep-all-tagged e - must-match-tagged )

Depois de encontrar duplicatas, rmlint cria um script executável rmlint.sh que você pode executar (após a verificação) para excluir as duplicatas.

    
por 07.03.2018 / 23:38