Todos os comandos iniciam a partir do diretório de nível superior e assumem que você não possui novas linhas nos nomes de arquivos. Eu assumo as ferramentas GNU (Linux ou Cygwin). Atenção, isso é tudo código não testado, digitado diretamente no navegador.
É bastante fácil mesclar todos os diretórios para minúsculas. Uma abordagem é recopiar todos os diretórios e mesclá-los em suas contrapartes minúsculas. Faça a profundidade de percurso primeiro para que, quando você mesclar dois diretórios, seu conteúdo já esteja normalizado.
find . -depth -name '*[[:upper:]]*' -type d -execdir sh -c '
source=$0
target=$(echo "$source" | tr "[:upper:]" "[:lower:]")
if [ "$source" != "$target" ]; then # need to rename or merge
if [ -d "$target" ]; then
# merge $source (mixed- or uppercase) into $target (lowercase)
find "$source" -mindepth 1 -maxdepth 1 -exec mv -bt "$target" {} +
rmdir "$source"
else
mv "$source" "$target"
fi
fi
' {} \;
Se você deseja mesclar de minúsculas para maiúsculas e minúsculas, é necessário determinar o diretório de maiúsculas e minúsculas correspondente a cada diretório minúsculo. O snippet a seguir escolhe um diretório arbitrário de letras maiúsculas e minúsculas se houver mais de um.
find . -depth ! -name '*[[:upper:]]*' -type d -execdir sh -c '
source=$0
target=$(find . -maxdepth 1 -iname "$source" -not -name "$source" -print -quit)
if [ -n "$target" ]; then …
fi
' {} \;