Não existe um único programa que execute a função renomear / mesclar, embora mv ... -t ... seja útil se puder ser mais facilmente usado em um comando find . Então, o que eu planejei é:
find BaseDir/ -type d -name "A" | sort -r | while read d; \
do [ -d "${d%A}B" ] && mv "$d"/* "${d%A}B"/ && rmdir "$d" || \
mv "$d" "${d%A}B"; done
O que isto faz é: -
- Localize todos os diretórios com o nome
A. - Ordene reversa para que, por exemplo,
BaseDir/A/Aseja renomeado antes deBaseDir/A: se o último for renomeado primeiro, o primeiro não será encontrado posteriormente. - Percorra cada diretório encontrado: se
Bnão existir, uma simples renomeação funcionará; caso contrário, os conteúdos deAserão movidos paraBe o agora vazioApoderá ser removido.
Observe que, se B preexistente, todos os arquivos contidos nele serão substituídos por arquivos com o mesmo nome em A : você pode adicionar comandos extras para evitar isso - você pode usar mv -i , mas você precisará restabelecer o terminal para qualquer solicitação (por exemplo, mv </dev/stdin -i ... ou qualquer que seja o suporte do Linux), pois stdin foi redirecionado no script.
Eu usei aspas para permitir espaços em branco em qualquer um dos elementos do caminho, incluindo A e B .
Eu tentei testar diferentes hierarquias, mas não posso ter certeza de que cobri todas as estruturas que você pode usar. Eu sugiro que você coloque echo antes dos comandos mv e rmdir primeiro, até que você tenha verificado que o comando faz o que você quer.