Como você deseja compará-los por conteúdo, o uso de hashes parece ser uma maneira de fazer isso.
Você pode usar o comando find
para obter uma lista de caminhos de arquivo de um diretório. A opção -type f
deixará de fora todos os diretórios e apenas os caminhos de saída para arquivos regulares. A opção -exec md5sum {} \;
pegará os caminhos encontrados e os dará ao comando md5sum
para transformar em uma lista md5 hash + seus caminhos de arquivo ('md5_hash / path / to / file').
Enviamos essa lista para o comando cut
. A primeira opção -f 1
diz para apenas pegar a primeira coluna (os hashes). O segundo -d ' '
diz para usar um caractere de espaço como o delimitador entre as colunas. O padrão é uma TAB.
Enviamos essa lista de hashes para o comando sort, para facilitar para diff
.
O operador <( command )
é chamado de Substituição de processo . Ele pega a saída de um comando e o transforma em um pseudo arquivo para comandos que os exigem como entrada (para uma explicação menos simples, siga o link). Dessa forma, parece diff
como se quiséssemos comparar dois arquivos.
:~$ diff <(find folder1/ -type f -exec md5sum {} \; | cut -f 1 -d ' ' | sort) \
<(find folder2/ -type f -exec md5sum {} \; | cut -f 1 -d ' ' | sort)
Nota: não se esqueça de substituir folder1 / e folder2 / por suas pastas atuais.
Isso lhe dará uma lista de hashes md5 dos arquivos que estão apenas em um ou no outro.
Se você quiser saber quais arquivos estão realmente ausentes, faça o seguinte:
:~$ find folder1/ -type f -exec md5sum {} \; | sort | grep my_md5_hash
Se você tiver muitos arquivos para verificar, seria prudente salvar os resultados dos dois comandos <(find ...)
e compará-los como:
:~$ diff list1.txt list2.txt
:~$ cat list1.txt | grep my_md5_hash