zsh には、zmv という便利なコマンドがあります。この使い方をまとめます。
基本の使い方
zmv '変換元' '変換先'
変換元には、zsh の glob パターンが指定できます。
例えば、次のように使います。
zmv '(*).xxx' '$1.yyy'
このコマンドは、実際には次のようなコマンドを実行してくれます(マッチするファイルが3つあった場合の例)。
mv -- hoge1.xxx hoge1.yyy
mv -- hoge2.xxx hoge2.yyy
mv -- hoge3.xxx hoge3.yyy
別の例として、次のように複数パターンの指定も可能です。
zmv '(**/)(*).xxx' '$1$2.yyy'
より簡単に使うためのオプション
次のオプションを使うと、より簡潔に書けて便利です。
-
-W
: 変換元に含まれるワイルドカードは括弧がついているとみなす。また、変換先に含まれるワイルドカードは順に$1
,$2
, ... とみなす。
これを使うと、上に出てきた例は次のように書けます。
zmv -W '*.xxx' '*.yyy'
zmv -W '**/*.xxx' '**/*.yyy'
さらに、noglob
を使うと、シングルクォートも省略できます。
次のようなエイリアスを定義すると便利です。
alias rename="noglob zmv -W"
こうすると、次のように直観的に書けます。
rename *.xxx *.yyy
rename **/*.xxx **/*.yyy
僕は、簡単な変換の場合は rename
を使い、複雑な変換の場合は zmv
を生で使う、と使い分けています。
確認用のオプション
複雑な変換の場合は、パターンが正しく指定できているか確認できるような、次のオプションが便利です。
-
-n
: 処理の表示のみ行い、実際には実行しません。 -
-v
: 処理を表示しながら実行します。 -
-i
: 対話的に実行します。
リネーム以外の処理を行う
実は、リネーム以外の処理を行うこともできます。
-
-C
:mv
の代わりにcp
を実行します。 -
-L
:mv
の代わりにln
を実行します。 -
-p コマンド
:mv
の代わりに指定したコマンドを実行します。
参照
zmv
については、man zshcontrib
の OTHER FUNCTIONS に記載があります。