Verifique se todos os arquivos em um diretório existem em outro lugar

3

Estou prestes a remover um diretório de backup antigo, mas antes disso eu gostaria de ter certeza de que todos esses arquivos existam em um diretório mais recente.

Existe uma ferramenta para isso? Ou é melhor fazer isso "manualmente" usando find , md5sum , classificação, comparação, etc?

Esclarecimento:

Se eu tiver as seguintes listagens de diretório

/path/to/old_backup/dir1/fileA
/path/to/old_backup/dir1/fileB
/path/to/old_backup/dir2/fileC

e

/path/to/new_backup/dir1/fileA
/path/to/new_backup/dir2/fileB
/path/to/new_backup/dir2/fileD

, em seguida, fileA e fileB existem em new_backup ( fileA em seu diretório original e fileB foi movido de dir1 para dir2 ). Por outro lado, fileC está ausente em new_backup e fileD foi criado. Nesta situação eu gostaria que a saída fosse algo como

fileC exists in old_backup, but not in new_backup.
    
por aioobe 10.06.2012 / 09:06

3 respostas

1

O Python possui alguns módulos de biblioteca padrão para este chamado dircmp / filecmp.

Do PyMOTW de Doug Hellmann, Esse pequeno código te dá:

import filecmp

filecmp.dircmp('example/dir1', 'example/dir2').report()

Dá a você:

diff example/dir1 example/dir2
Only in example/dir1 : ['dir_only_in_dir1', 'file_only_in_dir1']
Only in example/dir2 : ['dir_only_in_dir2', 'file_only_in_dir2']
Identical files : ['common_file', 'not_the_same']
Common subdirectories : ['common_dir']
Common funny cases : ['file_in_dir1']

Doug explica o skinny completo no modo filecmp / dircmp melhor do que eu em:

link

Eu gosto do Python para coisas como essa porque ele é muito mais fácil de se conectar entre Linux / Windows / Solaris do que qualquer coisa baseada em shell.

    
por 10.06.2012 / 10:24
1

Eu faria minha própria ferramenta. Vá a rota manual para esta com algumas descobertas extravagantes:

find /oldbackup -exec basename {} ";" > /tmp/old.txt
find /newbackup -exec basename {} ";" > /tmp/new.txt
for $filename in 'cat /tmp/old.txt'
do
    grep $filename /tmp/new.txt
    if [ "$?" -ne "0" ];
    then
       echo "$filename not in new backup"
    fi
done

Isso é incrivelmente desleixado, mas o algoritmo básico deve estar bem. Você também pode fazer algumas pesquisas para descobrir quais arquivos não têm cópias nos dois, assim:

find /oldbackup -exec basename {} ";" > /tmp/old.txt
find /newbackup -exec basename {} ";" > /tmp/new.txt
cat /tmp/old.txt /tmp/new.txt | sort | uniq -c | grep -v 2

Eu posso explicar os fragmentos, se você precisar.

    
por 10.06.2012 / 09:56
0

Use diff -uRN dir1 dir2

O diff estará vazio se os arquivos estiverem perfeitos ... Ou será exibido!

    
por 10.06.2012 / 09:15

Tags