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/A
seja renomeado antes deBaseDir/A
: se o último for renomeado primeiro, o primeiro não será encontrado posteriormente. - Percorra cada diretório encontrado: se
B
não existir, uma simples renomeação funcionará; caso contrário, os conteúdos deA
serão movidos paraB
e o agora vazioA
poderá 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.