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

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

Estou percorrendo vários arquivos e $filerepresenta o arquivo atual.

Como posso fazer cópias ou renomear e manter a mesma extensão para este arquivo atual?

por exemplo, se $file=x.jpg

Como fazer uma cópia de $file's com um nome de arquivo dex_orig.jpg

Até agora eu tenho:

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

mas isso copia o arquivo

DSCF1748.JPG

para

DSCF1748.JPG+_orig.JPG

enquanto eu quero uma cópia chamada

DSCF1748_orig.JPG

Da mesma forma, usandocp $file "$file"_orig.JPG

resulta em arquivos comoDSCF1748.JPG_orig.JPG

Eu quero pegar _origo meio do nome do arquivo ...

Responder1

Você pode usar o bashrecursos de substituição de stringpor isso:

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

O formato geral é ${string%substring}aquele que será removido substringdo final de string. Por exemplo:

$ f=foobar.JPG; echo "${f%.JPG}"
foobar

Responder2

zcp -o -p '/tmp/p/DSC*.JPG' '$f:r_orig.JPG'

ou equivalente

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 em seu ~/.zshrc:

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

-o -pdiz zcppara passar a opção -pao cpcomando, para preservar os metadados do arquivo (especialmente os tempos de modificação).

informação relacionada