UNIX/Linuxの部屋 renameコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド rename ファイル名や拡張子の一括変更 (リネーム・一括置換) このエントリーをはてなブックマークに追加

最終更新


rename コマンドは、主に Linux においてファイル名や拡張子などを一括して変更・置換・リネームするコマンドである。世の中にはさまざまな rename コマンドが存在するため、使用時は注意が必要である。


UNIX と Linux におけるファイル名変更
ファイル名の変更は、UNIX・Linux においては mv コマンドを使用するが、mv コマンドでは複数ファイルを一括してリネームすることはできない。一括変更したい場合は for・sed・mv などを
組み合わせて行う。

Linux でも上記の方法は可能であるが、rename コマンドにてより簡単にファイル名や拡張子を変更することもできる。

Linux における 2種類の rename コマンド
大変残念なことに、Linux では 2種類の rename コマンドが存在する。

ひとつは Perl に含まれる (同梱されている) rename コマンド。Ubuntu・Debian はこちらだと思う。

もうひとつは util-linux (旧名 util-linux-ng) パッケージに含まれている rename コマンド。CentOS はこちらだと思う。

少なくとも util-linux (旧名 util-linux-ng) は全ての Linux のディストリビューションにて標準でインストールされていると思われるため、少なくともいずれかの rename コマンドが標準で利用可能ではないかと思われる。

なお、Debian・Ubuntu においては下記のようになっていると思われる。
  • Perl 同梱版は prename というコマンド名でインストールされる
  • util-linux 版は rename.ul というコマンド名でインストールされる
  • デフォルトで rename は prename になっている。
  • update-alternatives にて、rename が prename を指すか、rename.ul を指すかを変更可能

Perl 同梱の rename コマンドの使い方
rename コマンドを引数なしで実行すると下記のように表示される場合、それは Perl 同梱の rename コマンドである。
% rename
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

Perl 同梱の rename コマンドの書式は下記のとおりである。
% rename 's/置換前/置換後/' [ファイル名 ...]
具体例を下記に示す。
% rename 's/.htm/.html/' *.htm
→ 拡張子を .htm から *.html に変更する
% rename 's/foo-/bar-/' foo-*.txt
→ foo- を bar- に変更する。
% rename 's/^hoge//' hoge*.txt
→ 先頭の hoge を削除する (hoge-abc.txt を abc.txt にする)
% rename 's/^/hoge/' *.txt
→ 先頭に hoge を追加する (abc.txt を hogeabc.txt にする)

Perl 同梱の rename コマンドに -n オプションを渡すと、どのようなリネームをするか表示のみ行い、実際にはリネームを行わないので、実行前に -n で確認することを強くおすすめする。
% rename -n 's/abc/def/' *.txt
abc001.txt renamed as def001.txt
abc002.txt renamed as def002.txt
abc003.txt renamed as def003.txt

util-linux (旧名 util-linux-ng) の rename コマンドの使い方
rename コマンドを引数なしで実行すると下記のようになる場合、それは util-linux (旧名 util-linux-ng) の rename コマンドと思われる。
% rename
call: rename from to files…

util-linux (旧名 util-linux-ng) の rename コマンドの書式は下記のとおり。
% rename [from] [to] ファイル ...
実行例は下記のとおり。
% rename .htm .html *.htm
→ 拡張子を .htm から .html に変更
% rename foo- bar- foo-*.txt
→ foo-*.txt を bar-*.txt に変更
% rename hoge "" hoge*.txt
→ ファイル名先頭の hoge を削除
% rename "" hoge *.txt
→ ファイル名の先頭に hoge を加える

util-linux の rename コマンドは、2018年時点ではいろいろなオプションがあり、-n で実行せずに動作確認もできる。しかし少なくとも CentOS 6.8 は util-linux-ng のバージョンが古く、オプションを一切受け付けない模様である。マニュアルは下記にあるので、手元の rename コマンドで使えるか確認してほしい。

rename コマンドの注意点
いずれの rename コマンドも、実際の処理としては、
1. コマンドラインで指定されたファイル名を、元ファイル名とする。
(Perl の rename の場合)
2. ファイル名に対し、s/from/to/ を実行する。
(util-linux の rename 場合)
2. ファイル名に FROM が含まれていたら TO に置換し、新ファイル名とする。
3. rename(2) にて、元ファイル名 → 新ファイル名 にリネームする。
を行うシンプルなつくりだが、シンプルすぎていろいろと注意が必要である。

まず、置換の際に単純に文字列として置換するのみであることに注意。対象文字列がファイル名なのかディレクトリ名なのかに関わらず、単純に置換する。
% rename abc def abc/file.c
とすると、abc/file.c → def/file.c となる。def/ というディレクトリがあればファイル移動になるが、def/ が存在しない場合はエラーとなる。

また、置換対象文字列が複数含まれていても、最初の文字列のみ置換される。
% rename abc def abc/abc.c
とすると、abc/abc.c → def/abc.c となる。

単純な文字列置換なので、
% rename / - dir/*.txt
とすることで、
dirA/file1.txt → dirA-file1.txt
dirA/file2.txt → dirA-file2.txt
dirB/file3.txt → dirB-file3.txt
などと、ディレクトリ構成をフラットにすることもできる。

FreeBSD の rename
port/package に sysutil/rename というものがある。これはまた別物のようだ。
http://rename.sourceforge.net/

mac の rename
mac では Homebrew にて rename コマンドをインストールできるようだが、これもさらに別物のようだ。

単純な文字列指定でも、正規表現でもいける。
% rename -s hoge fuga *.html
% rename 's/html/htm/' *.html
マニュアルは下記。

DOS・Windows の rename コマンド
DOS における rename コマンド (ren コマンド) は
rename *.txt *.csv
という置換ができるが、Linux の rename コマンドではこの書き方はできない。
>> Linuxオンラインマニュアル(man) Linux rename(2)
>> Linuxオンラインマニュアル(man) Linux rename(1)