renomeando erro de script de arquivos

0

Eu escrevi o código para alterar o nome do volume do arquivo, ele deve substituir os espaços com sublinhados e conter em minúsculas o nome do arquivo.

este é o código

for file in *;
do mv "$file" 'echo $file | sed -e 's/  */_/g' -e 's/_-_/-/g'';
do mv -f "$file" 'echo "$file" | tr A-Z a-z';
done;

Eu sei que a variável $file mudará após a segunda linha, então isso dará erro na terceira linha

Eu posso dividi-lo em 2 loops e, em seguida, ele funcionará, mas preciso informar como superar isso em apenas um loop for

    
por Fat Mind 23.08.2015 / 08:57

1 resposta

1

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

  1. Como você usou a opção -f para mv , é possível que esse script faça com que os arquivos em seu diretório sejam substituídos e seus conteúdos sejam perdidos.

  2. 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.

  3. 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.

por John1024 23.08.2015 / 09:14