find /path/to/directory -type f -name "*:*" -exec rename -n 's/:/-/g' {} +
(Se este comando não funcionar para você, veja a Nota de compatibilidade no final desta resposta.)
Esta é uma versão básica segura que imprime apenas o que aconteceria. Para que isso aconteça, elimine a opção -n .
Funcionaria sem -name "*:*" , mas é bom deixar que find passe apenas os nomes de arquivos que devem ser alterados porque isso torna o comando inteiro mais rápido.
Funciona assim:
-
findencontra ...- ... no
/path/to/directorydir ... - ... todos os arquivos (
-type f) ... - ... com nomes correspondentes (
-name "*:*"), ... - ... então executa
rename(várias vezes, se necessário) ... - ... com o padrão para substituir
:por-... - ... em todos os arquivos encontrados, vários arquivos de uma só vez (
{} +).
- ... no
Notas:
- O comando não renomeia os diretórios e isso é por design.
- A renomeação pode não funcionar com alguns caracteres incomuns no nome do arquivo (por exemplo, nova linha). Certamente você não tem esses nomes de arquivos, então esta é uma nota formal.
Nota de Compatibilidade
A solução usa o script Perl rename do pacote rename disponível no Debian, Ubuntu. Outras distros podem ter rename de util-linux .
Este manual sugere que a solução para não-Perl rename deve ser :
find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +
(Mais uma vez, remova -n se parece certo.) Eu não testei isso embora. Eu acho que irá substituir apenas os primeiros dois pontos em um nome de arquivo. Uma solução alternativa é repetir o comando (sem -n , com -v ) até que não haja dois pontos restantes.
Como alternativa, você pode obter o script Perl em um arquivo disponível em este site (atualmente File-Rename-0.20.tar.gz , o script é denominado rename.PL ). Veja também esta questão .