Encontre arquivos exclusivos em duas unidades

1

Estou tentando comparar dois volumes, que têm basicamente o mesmo conteúdo, mas em estruturas de pastas completamente diferentes. (Cerca de 2 milhões de arquivos.)

Eu quero ver quais arquivos são APENAS em uma pasta e não em outra - com base no tamanho & nome.

Eu tentei isso:

find /Volumes/1/ /Volumes/2/ -not -empty -type f -printf "%D\t%s\t%f\n" | sort -t$'\t' -k2 -n | uniq -uf1 | sort

A ideia é obter uma lista de todos os arquivos, com dispositivo, tamanho e nome, e remover todos os duplicados.

... mas não está funcionando. Eu ainda recebo arquivos comuns para ambas as unidades no meu resultado.

O ideal seria também incluir o caminho completo na lista de resultados, mas não sei como incluir isso sem alterar a classificação / uniq-ing.

    
por Ze'ev 02.02.2014 / 09:43

2 respostas

0

EDIT: resposta sobre a necessidade de preservar o dispositivo

find dir1/ dir2/ -type f -printf "%D\t%s\t%f\n" | \
    sort -t$'\t' -k2 | \
    uniq -uf2

find /Volumes/1/ /Volumes/2/ -type f -printf "%f\n" | sort | uniq -u mostrará arquivos ausentes apenas pelo nome do arquivo

find /Volumes/1/ /Volumes/2/ -type f -printf "%s-%f\n" | sort | uniq -u mostrará arquivos ausentes por correspondência de nome de arquivo e tamanho

A segunda opção produzirá arquivos duas vezes se houver incompatibilidade de tamanho. Se não é isso que você quer, você pode refilter a lista assim:

find /Volumes/1/ /Volumes/2/ -type f -printf "%s\t%f\n" | sort | uniq -u | \
    cut -d$'\t' -f 2|sort|uniq
    
por 03.02.2014 / 20:25
-1

Use o rsync com -R (opção relativa para mostrar o caminho completo)

rsync -rvcnR --delete path_to_sync/ path_to_orig/

A outra linha de comando alterna r, v, c e tell rsync (verifique detalhes na página de manual) para executar uma sincronização baseada em soma de verificação, recursiva, dos dois diretórios, mas apenas para show: -n

Edite para permitir a exclusão e movimentação de arquivos que causaram a corrupção da estrutura do arquivo após o rsync inicial que o originador esclareceu após minha resposta.

altere sua localização para algo assim:

find /Volume/1/ /Volume/2/ -printf '%f %s\t%D%p\n' | sort -uk1,1 | cut -f 2- -d ' '

Use printf para criar o primeiro campo usando o nome do arquivo seguido pelos campos que você precisa, classifique por este primeiro campo para arquivos exclusivos e exclua o campo 1 deixando os arquivos exclusivos. Se você usar espaços em nomes de arquivos, você precisaria usar um delimitador diferente para o espaço que usei para o separador de corte.

    
por 02.02.2014 / 11:41