複数のファイルをループして、$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 を実行し (他のシェルにはこのようなものはありません)、次のものを に入力する必要があります~/.zshrc
。
autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
-o -p
ファイルのメタデータ (特に変更時刻) を保持するためのzcp
オプションをコマンド-p
に渡すように指示します。cp