複数のファイルをコピーしながら拡張子を同じに保つにはどうすればよいでしょうか?

複数のファイルをコピーしながら拡張子を同じに保つにはどうすればよいでしょうか?

複数のファイルをループして、$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}を削除します。例:substringstring

$ 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

関連情報