2015/04/28

Ubuntu  remane を使ったファイル名の一括変換 1

写真などを整理するときに大量に名前を書き換えたい場合がある。そんな時には 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; について

2 件のコメント :

  1. ありがとうございます!
    コマンド操作にまだ不慣れなのでとても参考になりました

    返信削除
    返信
    1. 複数のファイルを一括操作出来るのはCLIの長所だと思います。大量のファイル名を変換する必要に迫られて調べたことをまとめてみました。お役に立てて嬉しい限りです。

      削除