A necessidade de renomear arquivos é comum na hora de fazer cópias de arquivos entres discos com diferentes formatações (NFTS, Ext4 e etc), e para remover caracteres especiais em vários arquivos deve se proceder da seguinte forma. Por exemplo, vejamos com trocar o ":" por "___" no nome de todos os arquivos da pasta, e também das pastas, recursivamente [1]. Aqui foi escolhido 3 underlines porque é mais específico, o que permite que a operação possa ser revertida posteriormente. Primeiramente, apenas para ver quais os arquivos que serão afetados, sem fazer alterações, o comando a ser usado é:
find . -depth -execdir rename -n 's/:/___/g' {} +
.-depth faz a troca de trás pra frente na árvore de pastas, o que pode ser demorado mas evita problemas com a troca em nome de pastas. Depois de ver quais os arquivos que serão afetados, e para fazer as alterações, de fato, remova o parâmetro -n:
find . -depth -execdir rename 's/:/___/g' {} +
Para trocar vários caracteres especiais por um mesmo texto, por exemplo, trocar o ":" e "*" por "___", deve-se usar o seguinte comando:
find . -depth -execdir rename -n 's/[:*]/___/g' {} +
Esse procedimento, porém, atrapalha reverter o procedimento depois.
Espaço em branco no final do nome dos arquivos (chamado em inglês de trailing space) e quebra de linha também causam problemas. Nesse caso, usa-se o comando [2]:
find . -depth -execdir rename 's/'$'\n''| *$/g' {} +
O " *$" serve para eliminar os espaços em branco no final do nome dos arquivos e o "'$'\n''" para eliminar as quebras de linhas.
[1]
https://stackoverflow.com/questions/52206158/replace-special-characters-recursively-bash
[2]
https://askubuntu.com/questions/668088/remove-leading-or-trailing-spaces-in-file-or-folder-names