sed / PATTERN / SUB / $ VAR?

1

Estou renomeando alguns arquivos.

Isso funciona:
ls | while IFS= read -r line; do name=$(echo $line | sed -e 's/\(.*\)/.jpg/') && mv $line $name; done

O que é certo, mas eu gostaria de torná-lo mais conciso, como: ls | while IFS= read -r line; do name=$(sed -e 's/\(.*\)/.jpg/' $line) && mv $line $name; done

O último exemplo e várias tentativas semelhantes passam o arquivo para sed ao invés do valor da variável.

O uso de co $line ˋ e $($line) resulta em uma tentativa de executar o arquivo. Enquanto as variações de "$line" , 'line' com e sem < , levam a que o arquivo seja lido. O que está acontecendo aqui? A variável $line pode ser usada diretamente com o sed para esse fim?

    
por dies_felices 10.01.2017 / 15:42

2 respostas

1

Você pode usar <<> Aqui String com a sintaxe <<< :

ls | while IFS= read -r line
do
  name=$(sed 's/\(.*\)/.jpg/' <<< $line) && mv "$line" "$name"
done

Esteja ciente de que não é uma boa ideia analisar a saída de ls (nem usar variáveis sem aspas).

Existe também um nome de ferramenta rename (no caso de o objetivo ser simplesmente renomear o arquivo):

rename -n 's/$/.jpg/' *

Remova o sinalizador -n para alterar da visualização para a renomeação real.

    
por 10.01.2017 / 15:52
7

parece que você está apenas querendo anexar .jpg ao final de todos os nomes dos arquivos no diretório atual. Se for esse o caso, existem maneiras mais fáceis:

for f in ./*; do
  mv -- "$f" "$f.jpg"
done

O -- garante que os nomes dos arquivos com um traço inicial ( - ) não sejam interpretados como opções para mv . No entanto, isso não é um problema, pois também estamos certificando-nos de que $f sempre tenha o caminho ./ no início usando ./* no loop.

A saída de ls é para leitura por olhos e geralmente não é adequada para envio em loop de leitura lenta como você está fazendo.

E sim, no seu segundo exemplo ( sed -e 's/\(.*\)/.jpg/' $line ), o conteúdo do arquivo será lido por sed . Com o Bash, você poderia fazer sed '...' <<<"$line" . A construção <<<"string" é uma extensão Bash (também disponível em pelo menos ksh e zsh ) e é chamada de "here-string", e passará a string na entrada padrão para o comando.

    
por 10.01.2017 / 17:07