Debian系Linuxで、ファイルの拡張子を大文字から小文字に変換したかったので、手順を探そうとGoogle検索してみたけど、ファイル全体の変換ばかりヒットする。
このため、断片的な情報を混ぜ合わせて、自力で解決してみた。
なお、先に書いておくけど、本記事では「rename」というツールを使用する。(標準コマンドではない。)
【目次】
試した環境
- WSL(Windows Subsystem for Linux)内のDebian GNU/Linux、バージョン13 (trixie)
ファイル名の置換を行うための前準備
普通にファイル名の変換を行うだけなら、mvを使うのが手っ取り早い。
$ mv example.JPG example.jpg
ただ、ファイルが1つだけなら良いけど、何十・何百と大量にある場合は、手作業でのリネームは効率が悪すぎるし、現実的ではない。
このため当記事では、ファイル名の置換に「rename」というツールの力を借りることにした。
「rename」は、Debianの初期状態ではインストールされていないと思うので、Debianのパッケージ管理ツール「apt」を使ってインストールを行う。
$ apt show rename #このコマンドは省略しても可 Package: rename Version: 2.02-1 Priority: optional Section: perl Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org> Installed-Size: 66.6 kB Depends: perl:any Homepage: https://metacpan.org/release/File-Rename Download-Size: 21.8 kB APT-Manual-Installed: yes APT-Sources: http://deb.debian.org/debian trixie/main amd64 Packages Description: Perl extension for renaming multiple files This package provides both a perl interface for renaming files (File::Rename) and a command line tool 'file-rename' which is intended to replace the version that used to be supplied by the perl package. $sudo apt install rename ~~~(以下、省略)~~~
ちなみに「rename」という外部プログラムではなく、実体はPerlの機能拡張ライブラリらしい。
動作にはPerlが必要だけど、なければaptが依存関係を解決しようと、一緒にインストールしてくれると思う。
「rename」を試してみる
まずは、適当に削除しても問題ないファイルを用意して、コマンドを試してみる。
ちなみにファイル検索と置換には、正規表現を使っている。
なお正規表現の詳細について触れると、記事が丸々1本出来上がるので、本記事では割愛。
$ rename -n 's/(.+\.)JPG/\1jpg/' *.JPG
オプション類の解説については、次の通り。
- -n
- No action。Dry runとも言い、実際の変換は行わない。テスト実行。
- 's/(.+\.)JPG/\1jpg/'
- ざっくり説明すると、正規表現でピリオドより前はそのまま使って、ピリオドより後ろをjpgに置き換えている。カッコ()で囲んだ部分を\1で参照しているイメージ。詳細は割愛。
- *.JPG
- 申し訳ない。ここは単純に手抜き。Linuxが大文字・小文字を識別する点を利用して「*.JPG」という大文字のファイルを指定してるだけ。
エラーがなければ、リネームの実行結果が表示される、という次第。
# rename(置換前, 置換後) rename(example.JPG, example.jpg)
本実行
テスト結果を確認して、問題がなければ、「-n」オプションを外して本実行する。
$ rename 's/(.+\.)JPG/\1jpg/' *.JPG $
Linuxコマンドっぽく、実行結果が正常終了すれば、何も表示されずプロンプト入力に戻る。
lsなどで結果を確認して終了。
逆に異常終了すれば、エラーメッセージが表示される。
試しに、わざと間違った構文を書いてみた結果が、次の通り。
$ rename -n 's/(.+\.)JPG/\1jpg//' *.JPG syntax error at line 2, at EOF Execution of (eval 25) aborted due to compilation errors, in: s/(.+\.)JPG/\1jpg//
「syntax error」(構文エラー)と表示された。
改良案
大文字で記された色んな拡張子に対応するなら、次に記す案もあり。
$ rename -n 's/(.+\.)([A-Z]{3})$/\1\L\2\E/' ./*.*
一応解説すると、拡張子3文字が全て大文字だった場合、2つめの後方参照「\2」を「\L」と「\E」で囲って全て小文字に置換している、という意味になる。
正規表現の後方参照で大文字・小文字変換するエスケープシーケンスに関しては、先ほど、こちらの記事 で見かけて知った次第。感謝。
あとがき
先日、何かの折に実行したのだけど、今日、すっかり忘れていたので、ブログに備忘メモとして、記事を書いてみた。
あくまでも備忘メモなので、正規表現を中心に、色々と割愛してる。
ただ、オプションなどの意味を知らずに使うと、あとで手痛いしっぺ返しを食らうので、この記事に辿り着いた方々には「ちゃんと理解して、試した上でオプションを使うこと」と伝えたい。
そんな訳で、分からない部分は個別で調べて頂ければと思う。
では。
【追記】
参考までに、正規表現に関する書籍のアフィリエイト広告を掲載。
改良案で触れた、正規表現による大文字・小文字置換についても記述あり。
なお、書籍は2018年発売で、2026年2月時点で電子書籍のみ取り扱ってる模様。
正規表現は何十年と言う歴史があり、基本的な考えや活用法は変わらないので、発行年が多少古くても問題なく読める。
【広告】