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 -
mvrenomeia 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 -
echoimprime seu argumento para a saída padrão -
trlê 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//:/-} .