Diffing dois diretórios recursivamente com base em checksums?

1

Estou tentando descobrir quais arquivos não existem em uma soma de verificação do conteúdo deles. Eu tenho dois diretórios /foo e /bar , ambos os diretórios representam estados arbitrários no sistema, eu quero encontrar todos os arquivos na raiz /bar que não existem na raiz /foo (recursivamente). Um dicionário de /bar/** com

CheckSum -> filepath

menos o dicionário de /foo/** com

CheckSum -> filepath  

Eu posso escrever isso usando md5sum ou algo assim, mas já deve haver um utilitário que faça isso.

Só para ficar claro, se dois arquivos são idênticos exceto por localização (nome e caminho), quero que eles sejam identificados como iguais.

Caso de teste

Vamos criar uma árvore com alguns dados de teste,

/tmp/foo
└── myFile (duplicate of /tmp/bar/quz/asdf/otherFileName)
/tmp/bar
├── qaz
│   └── findMe
└── quz
    └── asdf
        └── otherFileName (duplicate of /tmp/foo/myFile)

Script para criação,

mkdir -p /tmp/foo /tmp/bar/quz/asdf /tmp/bar/qaz

# One file that exists in both locations
dd if=/dev/urandom of=/tmp/foo/myFile bs=1k count=10
cp /tmp/foo/myFile /tmp/bar/quz/asdf/otherFileName

# One file (findMe) that exists in only /mpt/bar/
dd if=/dev/urandom of=/tmp/bar/qaz/findMe bs=1k count=10

Assim, o programa que compara /tmp/foo e /tmp/bar deve encontrar /tmp/bar/qaz/findMe

    
por Evan Carroll 16.12.2016 / 20:17

1 resposta

1

Eu geraria uma listagem md5sum (uma coluna para soma e uma coluna para nome de arquivo) para ambas as árvores e canalizaria o resultado em um script (digamos awk ou perl) que pode usar a soma como um hash para os nomes de arquivos. e faça o script relatar nomes de arquivos que tenham o mesmo valor de hash.

Isso é mais do que um simples e é algo frequentemente solicitado, frequentemente resolvido (uma pesquisa na web por arquivos duplicados por conteúdo gera mais de um milhão de acessos).

Você pode achar isso útil:

por 16.12.2016 / 21:54