我正在循環存取多個文件,並$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
命令,以保留檔案元資料(尤其是修改時間)。