Um simples 1-liner deve fazer (assume Posix sh
-compatible shell):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Explicação:
-
for ... in ...; do ...; done
é um circuito -
*:*
corresponde a todos os arquivos e diretórios no diretório atual diretório que tem:
em seu nome -
f
é atribuído por vez a cada nome de arquivo no loop -
mv
renomeia seu primeiro argumento para o segundo;-v
(verbose) pede para imprimir o que faz; esta opção é GNU-utils específica, por isso está disponível no Linux, mas não Solaris -
$(...)
executa o código em uma sub-casca e substitui a saída -
echo
imprime seu argumento para a saída padrão -
tr
lê a saída padrão e traduz os caracteres de acordo com o fornecido mapear
Se você estiver usando o bash ,
você pode evitar gerar um shell extra ( $()
) com subprocessos ( tr
)
substituindo $(...)
por ${f//:/-}
.