いくつかのファイルをループしていますが、$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
を入れたい...
そのために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
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
コマンドに渡して、ファイルのメタデータ(特に変更時間)を保持するように指示します。