Como posso comparar dois diretórios para comparar arquivos ausentes, quando os diretórios não têm a mesma estrutura?

3

Recebi um disco rígido de arquivos novos e atualizados de uma organização com a qual estamos trabalhando, mas já temos a maioria dos arquivos em nossos servidores e gostaríamos de atualizar nossas versões locais para corresponder às deles. / p>

Normalmente, isso seria um trabalho para algo como o rsync, mas nosso problema é que a estrutura de diretórios que eles fornecem é muito mal organizada e tivemos que reorganizar seus arquivos no passado para trabalhar melhor com nossos sistemas.

Então, minha pergunta é:

How can I find out which files in the set they have provided are new or different to the versions that we have, when the directory structures are different?

Quando essa pergunta for respondida, poderemos atualizar os arquivos alterados e descobrir onde colocar os novos arquivos em nosso sistema, provavelmente um pouco manualmente.

    
por David Dean 10.09.2012 / 03:58

2 respostas

2

Ok, aqui está minha primeira tentativa de algo. Parece funcionar moderadamente bem para o que eu preciso, mas estou aberto a sugestões melhores:

Primeiro, obtenha md5sums de todos os arquivos em nosso sistema de arquivos e nos novos dados:

find /location/of/data -type f -exec md5sum {} ';' > our.md5sums
find /media/newdisk -type f -exec md5sum {} ';' > their.md5sums

E eu escrevi um pequeno script python chamado md5diff.py:

#!/usr/bin/env python
import sys
print "Comparing", sys.argv[1], "to", sys.argv[2]

# Create a dictionary based upon the hashes in source B
dict = {}
for line in open(sys.argv[2]):
    p = line.partition(' ')
    dict[p[0]] = p[2].strip()


# Now go through source A and report where the file is in source B
for line in open(sys.argv[1]):
    p = line.partition(' ')
    if p[0] in dict:
        print line.strip(), "(", sys.argv[2], ":",dict[p[0]], ")"
    else:
        print line.strip(), "NOT IN", sys.argv[2]

Então, agora eu posso usar

./md5diff.py their.md5sums our.md5sums

E se eu adicionar um | grep "NOT IN" , ele listará apenas os arquivos em sua mídia que ainda não temos (ou é diferente do que temos). Eu posso começar a atacar manualmente as diferenças conhecidas.

    
por 10.09.2012 / 03:58
1

Você não precisa MD5 para comparar as alterações de horário de modificação. Com isso dito, você provavelmente (com a exceção de um enorme conjunto de dados) poderá copiar os arquivos novos e atualizados para o armazenamento local, usar uma ferramenta como fslint para identificar duplicatas, depois use tempos de modificação (não apenas MD5sums) para reconciliar todo o resto.

Uma pergunta importante é: como você sabe se um arquivo foi atualizado se o caminho não for o mesmo no novo armazenamento? Se os nomes dos arquivos não forem exclusivos ("Sales Report August 2012.xls" poderia se aplicar a muitos departamentos, por exemplo), como você sabe quando está atualizando um arquivo existente e sobrescrevendo um arquivo existente com conteúdo não relacionado?

Eu iria errar do lado do cuidado e manter tudo, incluindo caminhos de arquivo. Você pode identificar arquivos idênticos e criar links simbólicos para os originais para o sistema de desduplicação de um homem pobre, mas, na realidade, seu sistema de armazenamento deve lidar com isso para você. O pior cenário é jogar dados do usuário apenas para economizar espaço.

    
por 10.09.2012 / 09:05

Tags