Como copiar vários arquivos, mas manter suas extensões iguais?

3

Estou fazendo um loop em vários arquivos e $file representa o arquivo atual.

Como posso fazer cópias ou renomeações e manter a extensão igual para este arquivo atual?

por exemplo. if $file = x.jpg

Como fazer uma cópia de $file com um nome de arquivo de x_orig.jpg

Até agora eu tenho:

for file in /tmp/p/DSC*.JPG; do
  cp $file $file+'_orig'.JPG
done

mas copia o arquivo

DSCF1748.JPG

para

DSCF1748.JPG+_orig.JPG

Considerando que eu quero uma cópia chamada

DSCF1748_orig.JPG

Da mesma forma, usando cp $file "$file"_orig.JPG

resulta em arquivos como DSCF1748.JPG_orig.JPG

Eu quero pegar o _orig no meio do nome do arquivo ...

    
por Michael Durrant 29.09.2013 / 19:25

2 respostas

3

Você pode usar os recursos de substituição de string do bash para isso:

for file in /tmp/p/DSC*.JPG; do
  cp "$file" "${file%.JPG}"_orig.JPG
done

O formato geral é ${string%substring} , que removerá substring do final de string . Por exemplo:

$ f=foobar.JPG; echo "${f%.JPG}"
foobar
    
por 29.09.2013 / 19:41
2
zcp -o -p '/tmp/p/DSC*.JPG' '$f:r_orig.JPG'

ou equivalentemente

zcp -o -p '/tmp/p/(DSC*).JPG' '/tmp/p/${1}_orig.JPG'

Isso requer que você execute zsh (outros shells não têm nada parecido com isso) e coloque isso no seu ~/.zshrc :

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'

-o -p diz zcp para passar a opção -p para o comando cp , para preservar os metadados do arquivo (especialmente os tempos de modificação).

    
por 30.09.2013 / 03:31