我正在循环访问多个文件,并$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 (其他 shell 没有这样的东西)并将其放入您的~/.zshrc
:
autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
-o -p
告诉zcp
将选项传递-p
给cp
命令,以保留文件元数据(尤其是修改时间)。