
複数のファイルを繰り返しながら$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}
。たとえば、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