Я просматриваю несколько файлов и $file
представляю текущий файл.
Как мне сделать копии или переименовать текущий файл, сохранив при этом его расширение?
например, если $file
=x.jpg
Как сделать копию $file
с именем файлаx_orig.jpg
На данный момент я:
for file in /tmp/p/DSC*.JPG; do
cp $file $file+'_orig'.JPG
done
но это копирует файл
DSCF1748.JPG
к
DSCF1748.JPG+_orig.JPG
в то время как я хочу копию под названием
DSCF1748_orig.JPG
Аналогично, используяcp $file "$file"_orig.JPG
результаты в файлах, таких какDSCF1748.JPG_orig.JPG
Я хочу получить _orig
в середине имени файла...
решение1
Вы можете использовать bashфункции замены строкдля этого:
for file in /tmp/p/DSC*.JPG; do
cp "$file" "${file%.JPG}"_orig.JPG
done
Общий формат — это ${string%substring}
то, что удалит substring
с конца string
. Например:
$ f=foobar.JPG; echo "${f%.JPG}"
foobar
решение2
zcp -o -p '/tmp/p/DSC*.JPG' '$f:r_orig.JPG'
или эквивалентно
zcp -o -p '/tmp/p/(DSC*).JPG' '/tmp/p/${1}_orig.JPG'
Для этого вам необходимо запустить zsh (в других оболочках ничего подобного нет) и поместить в свой файл следующее ~/.zshrc
:
autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
-o -p
указывает zcp
на необходимость передать параметр -p
команде cp
для сохранения метаданных файла (особенно времени модификации).