Não existem métodos mais eficazes.
Você pode verificar se os tamanhos dos arquivos são os mesmos, mas há uma chance muito real de um falso positivo. Verificar a extensão do arquivo é inútil porque você pode ter dois arquivos idênticos com extensões diferentes.
Você pode verificar se o conteúdo do arquivo corresponde exatamente, por exemplo. com o comando cmp
, que faz parte de qualquer instalação do Unix. Isso é muito mais lento do que verificar o tamanho do arquivo, porque o tamanho é apenas uma leitura de metadados e uma comparação byte por byte requer a leitura de todos os arquivos.
Você pode computar uma soma de verificação, que é essencialmente a mesma que a anterior, mas (1) consome mais CPU no caso simples de dois arquivos e (2) torna a comparação de mais de dois arquivos muito mais fácil. A razão para isso é que você pode armazenar em cache a soma de verificação para que você não tenha que reler cada arquivo para cada outro arquivo, basta comparar as somas de verificação.
Se você tiver um tipo de arquivo conhecido, como um tipo de imagem, poderá realizar testes "melhores" para igualdade aproximada, se a igualdade aproximada for sua meta. Qualquer método desse tipo não consumiria menos CPU ou menos leituras de disco do que qualquer um dos métodos acima.
Se o seu sistema de arquivos é ZFS ou outro FS que faz checagem de arquivos ou bloqueia "nativamente" você pode comparar arquivos com eficiência simplesmente lendo metadados do sistema de arquivos.
Sua melhor aposta ao implementar um localizador de duplicatas genérico é usar uma solução pré-definida. Se você precisar fazer isso sozinho, deverá verificar e verificar todos os arquivos, manter um banco de dados dos resultados e, em seguida, atualizá-lo quando os arquivos forem alterados (ou periodicamente, se isso for melhor para o seu cenário). A verificação duplicada torna-se uma questão simples e eficiente de consultar o banco de dados.