Uma boa maneira de fazer essa comparação é usar find
com md5sum
, então a diff
.
Exemplo
Use find para listar todos os arquivos no diretório e 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
Execute o mesmo procedimento para o outro diretório:
find /dir2/ -type f -exec md5sum {} + | sort -k 2 > dir2.txt
Em seguida, compare o resultado dois arquivos com diff
:
diff -u dir1.txt dir2.txt
Ou como um único comando usando substituição de processo:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2) <(find /dir2/ -type f -exec md5sum {} + | sort -k 2)
Se você deseja 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 recortar imprime apenas o hash (primeiro campo) a ser comparado pelo 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 saberá 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/ .*\// /')
Essa estratégia é muito útil quando os dois diretórios a serem comparados não estão na mesma máquina e você precisa garantir que os arquivos sejam iguais nos dois diretórios.
Outra boa maneira de fazer o trabalho é usar o diff
comando 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/
bash --version
?