複数のファイルをコピーしますが、拡張子を同じに保つ方法は?

複数のファイルをコピーしますが、拡張子を同じに保つ方法は?

複数のファイルを繰り返しながら$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

バッシュが使えます文字列置換機能その理由は次のとおりです。

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オプションをコマンドに渡すように指示します。-pcp

関連情報