web-dev-qa-db-ja.com

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

いくつかのファイルをループしていますが、$fileは現在のファイルを表しています。

コピーまたは名前の変更を行い、この現在のファイルの拡張子を同じに保つにはどうすればよいですか?

例えばif $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を入れたい...

3
Michael Durrant

そのために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
3
terdon
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コマンドに渡して、ファイルのメタデータ(特に変更時間)を保持するように指示します。