私は現在、大量のファイルの名前を変更しようとしていますが、次のような非常に厄介な方法を使用しています。
rename 's:(.*).MOV:$1.mov:g' *.MOV
rename 's:(.*).JPG:$1.jpg:g' *.JPG
私が本当にやりたいのは、「y」sed
を使用してこれらすべてのコマンドを組み合わせることができるようにすることです。 オペレーター。明らかに、この演算子を使用すると、アイテムを小文字に変換できます。問題は、拡張機能のみを変換する必要があることです。このコマンドを使用してこれを行う方法はありますか?基本的に、次の式のキャプチャグループを小文字に変換する必要があります:^.+.(.+)$
。これを行う方法はありますか?私はこの種の変革に少し慣れていません。
承認された回答:
これがPerlベースのrename
構文から判断すると、Debian、Ubuntu、および派生物で見つかります。 tr
は使用できません 文字列全体に作用するため、演算子。ただし、拡張子を一致させ、L
で小文字にすることはできます 。
rename 's/.[^.]*$/L$&/' *.JPG *.MOV
ここでは不要ですが、正規表現が小文字にしたい部分よりも一致している場合は、一致する部分をグループに入れることができます:
rename 's/.([^.]*)$/.L$1/' *.JPG *.MOV
*.JPG *.MOV
を置き換えます *.*
による 拡張子に関係なく、すべてのファイルに作用します。 bash≥4.3(およびbash 4.0–4.2でも、これはディレクトリへのシンボリックリンクもトラバースすることに注意してください)では、サブディレクトリなどのファイルを再帰的に簡単に操作できます。
rename 's/.[^.]*$/L$&/' **/*.*
zshファンの場合(:r
および:e
修飾子は、拡張子をファイルの残りの部分から分離します):
autoload zmv
zmv '*.(MOV|JPG)' '${f:r}.${(L)f:e}' # these extensions, current directory
zmv '*.*' '${f:r}.${(L)f:e}' # all extensions, current directory
zmv '**/*.*' '${f:r}.${(L)f:e}' # all extensions, recursive directory traversal