¿Cómo copiar varios archivos pero mantener las mismas extensiones?

¿Cómo copiar varios archivos pero mantener las mismas extensiones?

Estoy recorriendo varios archivos y $filerepresento el archivo actual.

¿Cómo puedo hacer copias o cambiar el nombre y mantener la misma extensión para este archivo actual?

por ejemplo si $file=x.jpg

Cómo hacer una copia de $file's con un nombre de archivo dex_orig.jpg

Hasta ahora tengo:

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

pero eso copia el archivo

DSCF1748.JPG

a

DSCF1748.JPG+_orig.JPG

mientras que quiero una copia llamada

DSCF1748_orig.JPG

De manera similar, usandocp $file "$file"_orig.JPG

da como resultado archivos comoDSCF1748.JPG_orig.JPG

Quiero obtener el _origen medio del nombre del archivo...

Respuesta1

Puedes usar bashfunciones de sustitución de cadenaspara eso:

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

El formato general es ${string%substring}el que se eliminará substringdel final de string. Por ejemplo:

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

Respuesta2

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

o equivalente

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

Esto requiere que ejecutes zsh (otros shells no tienen nada como esto) y pongas esto en tu ~/.zshrc:

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

-o -pindica zcpque se pase la opción -pal cpcomando para preservar los metadatos del archivo (especialmente los tiempos de modificación).

información relacionada