renameは、ファイル名を一括でリネームするコマンドです。
このコマンドは、もともとUNIXにもなかったようですが、Raspbianを含むLinux系のOSをインストールすると標準で入っているコマンドで、すぐに使える状態になっているはずです。
使い慣れると大変便利で、使用する機会も多いと思います。まだ使ったことがないという方は是非試してみてください。
renameの基本的な使い方
renameは、基本的に2つの引数をとります。
- ファイル名の変更の仕方(正規表現で指定)
- 変更対象のファイル名(ワイルドカード使用可能)
例えば、カレントディレクトリ内にあるaaa.log, bbb.log, ccc.logという3つのファイルの”.log”を”.txt”に置き換える方法は以下の通りです。
1 | $ rename 's/\.log$/\.txt/' *.log |
このコマンドの’s/\.log$/\.txt/’の部分が「ファイル名の変更の仕方」です。
スポンサーリンクこれは正規表現(正確にはPerlの正規表現)という書き方に従って表現します。
これは慣れないと読みづらい文字列ですが、意味は以下の通りです。
まず、この正規表現全体が、s/パターン/置換文字列/という形になっていますが、これを置換演算子と呼んでいます。
「パターン」にマッチする文字列を「置換文字列」に置き換えるという意味です。
次に、”\.log$”と書いていますが、これは、「あとで指定するファイル名の末尾にある”.log”の部分」を表します。
先頭に\(バックスラッシュ)がついているのは、正規表現において、.(ピリオド)が”改行を除く任意の1文字”を表すメタ文字なので、ファイル名のピリオドを表現するためにバックスラッシュでエスケープするためです。
文章で書くとややこしいですが、ファイル名のピリオドをパターン中で指定する時にはこう書くものと、まずは理解してください。
$は、行末(この場合はファイル名の末尾)を表します。つまり、aaa.logにはマッチしますが、aaa.loga などというファイルがあってもそれにはマッチしません。
次に、”\.txt”という置換文字列ですが、これはパターンのところの説明とほぼ同じです。
コマンドの末尾の”*.log”は、ファイル名の末尾が.logというファイルのワイルドカード指定ですね。
早速、上記の3つのファイル(aaa.logなど)を用意して、実行してみてください。コマンド一発で.logが.txtに置き換わると思います。
正規表現は、これだけで1冊の本になるくらい奥が深いですので、とてもここですべてを紹介しきれません。インターネット上にもたくさんの情報が公開されていますから、必要に応じて調べて使用することになります。
上記の例では、ファイルの末尾の”.log”を変更しましたが、正規表現の書き方次第でいろいろな操作ができます。
2018で始まる100個のファイルのファイル名を2019で始まるように変更する、といったことも簡単できるでしょう。
研究してみてください。
renameのオプション
renameにはいくつかのオプションを指定することができます。
-v:どのファイルをrenameしたかを表示する
-v オプションを指定すると、どのようにrenameしたかを表示してくれます。
上記の例について実行すると、
1 2 3 4 | $ rename -v 's/\.log$/\.txt/' *.log aaa.log renamed as aaa.txt bbb.log renamed as bbb.txt ccc.log renamed as ccc.txt |
というように表示されると思います。
-n:どのファイルをrenameするかを表示するが、変更はしない。
-n オプションを指定すると、どのようにrenameするかを表示してくれます。ただし、rename処理は実際には行われません。
1 2 3 4 | rename -n 's/\.log$/\.txt/' *.log aaa.log renamed as aaa.txt bbb.log renamed as bbb.txt ccc.log renamed as ccc.txt |
表示は-vのときと同じですね。
renameの処理をさせる前に、お試しで実行するというときによく使います。
-f:同一ファイル名のファイルがあっても上書きする
-n オプションを指定すると、renameした後のファイル名と同名のファイル名があっても、上書きします。
例えば上記の例ではaaa.logをaaa.txtに置き換えますが、すでにaaa.txtが実行するディレクトリに存在すると、renameの処理はデフォルトでは実行されません。
1 | aaa.log not renamed: aaa.txt already exists |
という警告が表示され、renameの処理は行われないのです。
しかし、-fオプションをつけておくと、この警告は表示されず、上書きして実行されます。