Para renomear arquivos, provavelmente é mais simples usar o utilitário rename
do perl (às vezes chamado prename
). No entanto, vou assumir que você está fazendo isso como um exercício de aprendizado de script de shell.
Para corrigir o problema imediato, tudo o que você precisa é de uma segunda variável shell, aqui chamada new
:
for file in *
do
new=$(echo "$file" | sed -e 's/ */_/g' -e 's/_-_/-/g')
mv -f "$file" "$(echo "$new" | tr A-Z a-z)"
done
Outra abordagem é estender o pipeline:
for file in *
do
mv -f "$file" "$(echo "$file" | sed -e 's/ */_/g' -e 's/_-_/-/g' | tr A-Z a-z)"
done
Se você tem o GNU sed, o pipeline pode ser simplificado ainda mais:
for file in *
do
mv -f "$file" "$(echo "$file" | sed -e 's/ */_/g' -e 's/_-_/-/g' -e 's/.*/\L&/')"
done
Notas
-
Como você usou a opção
-f
paramv
, é possível que esse script faça com que os arquivos em seu diretório sejam substituídos e seus conteúdos sejam perdidos. -
Considere usar
$(...)
no lugar de backquotes para substituição de comando. A forma dólar-parentes nidifica bem, é visualmente clara e evita essa confusão que acontece porque muitas fontes não mostram uma diferença clara entre as carrapicas anteriores e as carrapatos regulares. -
Muitos idiomas exigem um ponto e vírgula no final de cada comando. shell não é uma dessas linguagens: o caractere de nova linha termina um comando exatamente como um ponto-e-vírgula faz.