Aqui está uma função que analisa recursivamente a árvore de diretórios especificada e cria uma matriz associativa cujas chaves são os nomes de arquivos encontrados em todos os subdiretórios e cujos valores são os caminhos correspondentes. Depois de executar essa função, tudo o que você precisa fazer é iterar os resultados e remover qualquer arquivo que tenha uma contagem de aparições maior do que 1:
function scandir_recursive($dir, &$result = array()) {
$dir = rtrim($dir, DIRECTORY_SEPARATOR);
foreach (scandir($dir) as $node) {
if ($node !== '.' and $node !== '..') {
if (is_dir($dir . DIRECTORY_SEPARATOR . $node)) {
scandir_recursive($dir . DIRECTORY_SEPARATOR . $node, $result);
} else {
$result[$node][] = $dir . DIRECTORY_SEPARATOR . $node;
}
}
}
return $result;
}
print_r(scandir_recursive(__DIR__));