写真などを整理するときに大量に名前を書き換えたい場合がある。そんな時には Ubuntu ならスクリプトを書けば一括変換できる。しかし、Linux には rename という
コマンドがあり,簡単にファイル名を一括変換できる。(参照:1,2,3)
ここではホームフォルダ内のフォルダ "work" の中に以下の4つのファイルがあるとして,renameコマンドの例を示す。
"42. Protokoll_01_07.pdf"
"43. Protokoll 2 September 2014.pdf"
"44. Protokoll 09 09.pdf"
"45. Protokoll FSMa 16 September.pdf"
0. 元のファイル名
まず、ターミナルを立ち上げる。
次にコマンド cd workで workフォルダ内に移動する。
ここで コマンド ls を入力すると,フォルダ内にどんなファイルがあるか確認出来る。
xxx@yyyy:~$ cd work
xxx@yyyy:~/work$ ls
42. Protokoll_01_07.pdf
43. Protokoll 2 September 2014.pdf
44. Protokoll 09 09.pdf
45. Protokoll FSMa 16 September.pdf
xxx@yyyy:~/work$
1-1. 置換 文字 "September" を数字 "9" に変換する
$ sudo rename 's/September/9/' *.pdf
ここで、*.pdf は
フォルダ内のすべての PDFファイルという意味。
's/September/9/' で
"September" を "9" に置換するという意味。
置換後
42. Protokoll_01_07.pdf
43. Protokoll 2
9 2014.pdf
44. Protokoll 09 09.pdf
45. Protokoll FSMa 16 9.pdf
1-2. 置換 最初の空白をアンダーバー "_" に変換する
$ sudo rename 's/ /_/' *.pdf
空白はそのまま空白にしておけばいい。空白には \s と入力するらしいが、空白でも大丈夫。
置換後
42.
_Protokoll
_01_
07.pdf
43.
_Protokoll 2 9 2014.pdf
44.
_Protokoll 09 09.pdf
45.
_Protokoll FSMa 16 9.pdf
1-3. 置換 すべての空白をアンダーバー "_" に変換する。
$ sudo rename 's/ /_/g' *.pdf
上のコマンドとほぼ同じだが,
最後に g が入る。これですべての空白が "_" に置換される。
置換後
42._Protokoll_01_07.pdf
43._Protokoll
_2
_9
_2014.pdf
44._Protokoll
_09
_09.pdf
45._Protokoll
_FSMa
_16
_9.pdf
1-4. 置換 1桁の数字を0をつけて2桁の数字に変換する。(例 2 -> 02)
$ sudo rename 's/\d+/sprintf("%02d", $&)/eg' *.pdf
ここで、
\d+ で数字を取得し,その数時が
1桁なら sprintf("%02d", $&) を使って十の位に "0" を補う。
sprintf("%02d", $&) は文字や数字を返す perl の関数。
$& には \d+ で取得した数字が入る。(参照:6)
また、
perl の関数 (コマンド) を利用する時には最後に e が入る。(参照:4,5)
置換後
42._Protokoll_01_07.pdf
43._Protokoll_
02_
09_2014.pdf
44._Protokoll_09_09.pdf
45._Protokoll_FSMa_16_
09.pdf
1-5. 置換 大文字を小文字に置換する
$ sudo rename 'y/A-Z/a-z/' *.pdf
文字を置換するときには '
y/before/after/' とする。
置換後
42._
protokoll_01_07.pdf
43._
protokoll_02_09_2014.pdf
44._
protokoll_09_09.pdf
45._
protokoll_
fsma_16_09.pdf
2-1. 削除 最初のドット "." を削除する。
$ sudo rename 's/.//' *.pdf
単に削除する時には
何も書かず,空欄も入れない。
削除後
42_protokoll_01_07.pdf
43_protokoll_02_09_2014.pdf
44_protokoll_09_09.pdf
45_protokoll_fsma_16_09.pdf
3-1. 補完 先頭に文字や数字を補完する
$ sudo rename 's/^/0/' *.pdf
^ でファイル名の先頭を指定している。
補完後
042_protokoll_01_07.pdf
043_protokoll_02_09_2014.pdf
044_protokoll_09_09.pdf
045_protokoll_fsma_16_09.pdf
3-2. 補完 最後(拡張子の前)に文字や数字を補完する
$ sudo rename 's/.pdf/_tokyo.pdf/' *.pdf
拡張子がない場合には 's/$/補完する文字列/' とすればよい。
補完後
042_protokoll_01_07
_tokyo.pdf
043_protokoll_02_09_2014
_tokyo.pdf
044_protokoll_09_09
_tokyo.pdf
045_protokoll_fsma_16_09
_tokyo.pdf
3-3. 補完 中間(月とtokyoの間)に数字(年号)を補完する
$ sudo rename 's/(_\d{2})(_tokyo)/$1_2014$2/' *.pdf
文字列を
カッコでくくると一つのグループとみなされ,
$1 には1番目の、
$2 には2番目のグループが対応する。
補完後
042_protokoll_01_07
_2014_tokyo.pdf
043_protokoll_02_09
_2014_tokyo.pdf
044_protokoll_09_09
_2014_tokyo.pdf
045_protokoll_fsma_16_09
_2014_tokyo.pdf
4-1. 連番 先頭の3桁の数字を 01 から始まる2桁の連番にする。
$ sudo rename 's/\d{3}/our $i; sprintf("%02d", 1+$i++)/e' *.pdf
our $i; で連番に使う変数を定義し、
1+$i++ で 1,2,3, ... となるように指定している。
そして、関数 sprintf で連番が 01, 02, 03, ... となるように指定している。(参照:6,7)
変更後
01_protokoll_01_07_2014_tokyo.pdf
02_protokoll_02_09_2014_tokyo.pdf
03_protokoll_09_09_2014_tokyo.pdf
04_protokoll_fsma_16_09_2014_tokyo.pdf
5-1. 入れ替え 日付が _日_月_年_ となっているので、_日_月_年_ と並べ替える。
$ sudo rename 's/(_\d{2})(_\d{2})(_\d{4})/$3$2$1/' *.pdf
3-3. の応用例、$1=(_\d{2})、$2=(_\d{2})、$3=(_\d{4}) となっている。
変更後
01_protokoll
_2014_07
_01_tokyo.pdf
02_protokoll
_2014_09
_02_tokyo.pdf
03_protokoll
_2014_09
_09_tokyo.pdf
04_protokoll_fsma
_2014_09
_16_tokyo.pdf
参照
1.
rename command
2.
Bulk renaming files in Ubuntu
3.
rename
4.
Perl 正規表現のクイックスタート (評価修飾子について)
5.
Reguläre Ausdrücke (Modifeier について)
6.
関数 sprintf について
7.
our $i; について