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:
-
find
encontra ...- ... no
/path/to/directory
dir ... - ... 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 .