Uma boa maneira de fazer essa comparação é usar find
com md5sum
e, em seguida, diff
.
Exemplo
Use find para listar todos os arquivos no diretório, em seguida, calcule o hash md5 para cada arquivo e canalize-o por nome de arquivo para um arquivo:
find /dir1/ -type f -exec md5sum {} + | sort -k 2 > dir1.txt
Faça o mesmo procedimento no outro diretório:
find /dir2/ -type f -exec md5sum {} + | sort -k 2 > dir2.txt
Em seguida, compare o resultado com dois arquivos com diff
:
diff -u dir1.txt dir2.txt
Ou como um único comando usando a substituição de processos:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2) <(find /dir2/ -type f -exec md5sum {} + | sort -k 2)
Se você quiser ver apenas as alterações:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ") <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ")
O comando cut imprime somente o hash (primeiro campo) a ser comparado por diff. Caso contrário, o diff imprimirá todas as linhas, pois os caminhos do diretório diferem mesmo quando o hash é o mesmo.
Mas você não sabe qual arquivo foi alterado ...
Para isso, você pode tentar algo como
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /') <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /')
Esta estratégia é muito útil quando os dois diretórios a serem comparados não estão na mesma máquina e você precisa ter certeza de que os arquivos são iguais em ambos os diretórios.
Outra boa maneira de fazer o trabalho é usar o comando diff
do Git (pode causar problemas quando os arquivos têm permissões diferentes - > todos os arquivos são listados na saída):
git diff --no-index dir1/ dir2/