Estou percorrendo vários arquivos e $file
representa 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 _orig
o 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 substring
do 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 -p
diz zcp
para passar a opção -p
ao cp
comando, para preservar os metadados do arquivo (especialmente os tempos de modificação).