Substituir espaços por sublinhados em arquivos: Erro no meu script bash

0

Eu não entendo o erro no meu script bash.

#!/bin/bash
newFile=""
for file in *
do
    newFile={$file/ /_}     # so as to replace spaces with underscores
    mv {$file} {$newFile}
done

Ele reclama que newFile não é um comando na linha newFile={$file/ /_}

Eu acho que estou fazendo as coisas erradas, mas eu continuo tropeçando nesse ponto.

    
por Stephane Rolland 25.06.2015 / 15:45

2 respostas

2

Você precisa mover a posição do $ e adicionar um último / ao sub para executá-lo em todos os espaços. Você também precisa citar as variáveis, pois ele verá o espaço no nome do arquivo como um delimitador entre os argumentos para mv.

#!/bin/bash
newFile=""
for file in *
do
    newFile=${file// /_}     # so as to replace spaces with underscores
    mv "{$file}" "{$newFile}"
done

Embora, conforme declarado na outra resposta, metade desse script seja redundante.

newFile=""

Não é necessário, pois a variável pode ser referenciada pela primeira vez na atribuição mais tarde.

 newFile=${file// /_}

Embora a atribuição em si também não seja necessária, pois a substituição do parâmetro não altera o original.

Por isso, pode ser reescrito como

#!/bin/bash
for file in *
do
    mv "${file}" "${file// /_}" 
done
    
por 25.06.2015 / 15:57
2

Para responder à sua pergunta com base nos comentários da sua pergunta:

  1. Você precisa colocar o caractere de dólar $ antes da chave caractere { .
  2. Além disso, é uma boa prática citar ( "" ) suas variáveis.
  3. E, finalmente, para ter todos os espaços substituídos por um sublinhado precisa usar duas barras ( // ) para ser 'ganancioso' na substituição.

Assim, um exemplo de script será parecido com:

#!/bin/bash

for myfile in *
do
    mv "${myfile}" "${myfile// /_}"
done

Observação: não é necessário ter uma variável adicional para conter o novo nome

    
por 25.06.2015 / 15:57

Tags