Estoy recorriendo varios archivos y $file
represento 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 _orig
en 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á substring
del 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 -p
indica zcp
que se pase la opción -p
al cp
comando para preservar los metadatos del archivo (especialmente los tiempos de modificación).