UNIX・Linuxでファイル名・フォルダ名の一括置換を行う

LinuxやUNIXを利用していると、スクリプト名などのファイル名のルールが変更したため、一括で置換を行いたいときがある。 そんな時は、どうすればいいのだろうか?

1.『rename』コマンドを利用する

もし『rename』コマンドがあるようならば、これを利用するといいだろう。 Linuxには大体最初から用意されている。(なお、Ubuntuの場合だと置換の指定方法がPerl(sed)の指定方法になっている)

rename 置換する単語 置換後の単語 対象PATH

この対象PATHにはワイルドカードも利用できるので、以下のように一括で置換を行える。

[root@test-centos7 test]# ls -l
合計 0
-rw-r--r--. 1 root root 0  7月  3 06:37 TCScript0.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 TCScript1.sh
drwxr-xr-x. 2 root root 6  7月  3 06:38 TCScript100
drwxr-xr-x. 2 root root 6  7月  3 06:38 TCScript101
drwxr-xr-x. 2 root root 6  7月  3 06:38 TCScript102
drwxr-xr-x. 2 root root 6  7月  3 06:38 TCScript103
drwxr-xr-x. 2 root root 6  7月  3 06:38 TCScript104
-rw-r--r--. 1 root root 0  7月  3 06:37 TCScript2.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 TCScript3.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 TCScript4.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 TCScript5.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 TCScript6.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 TCScript7.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 TCScript8.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 TCScript9.sh
[root@test-centos7 test]# rename TC AB ./*
[root@test-centos7 test]# ls -l
合計 0
-rw-r--r--. 1 root root 0  7月  3 06:37 ABScript0.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 ABScript1.sh
drwxr-xr-x. 2 root root 6  7月  3 06:38 ABScript100
drwxr-xr-x. 2 root root 6  7月  3 06:38 ABScript101
drwxr-xr-x. 2 root root 6  7月  3 06:38 ABScript102
drwxr-xr-x. 2 root root 6  7月  3 06:38 ABScript103
drwxr-xr-x. 2 root root 6  7月  3 06:38 ABScript104
-rw-r--r--. 1 root root 0  7月  3 06:37 ABScript2.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 ABScript3.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 ABScript4.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 ABScript5.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 ABScript6.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 ABScript7.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 ABScript8.sh
-rw-r--r--. 1 root root 0  7月  3 06:37 ABScript9.sh

どのファイルの名前を置換したのか知りたい場合は、「-v」オプションを付与しておくと良いだろう。

rename -v 置換する単語 置換後の単語 対象PATH
[root@test-centos7 test]# ls
ABScript0.sh  ABScript100  ABScript102  ABScript104   ABScript3.sh  ABScript5.sh  ABScript7.sh  ABScript9.sh
ABScript1.sh  ABScript101  ABScript103  ABScript2.sh  ABScript4.sh  ABScript6.sh  ABScript8.sh
[root@test-centos7 test]# rename -v AB CD ./*{0..5}.sh
`./ABScript0.sh' -> `./CDScript0.sh'
`./ABScript1.sh' -> `./CDScript1.sh'
`./ABScript2.sh' -> `./CDScript2.sh'
`./ABScript3.sh' -> `./CDScript3.sh'
`./ABScript4.sh' -> `./CDScript4.sh'
`./ABScript5.sh' -> `./CDScript5.sh'
[root@test-centos7 test]# ls
ABScript100  ABScript102  ABScript104   ABScript7.sh  ABScript9.sh  CDScript1.sh  CDScript3.sh  CDScript5.sh
ABScript101  ABScript103  ABScript6.sh  ABScript8.sh  CDScript0.sh  CDScript2.sh  CDScript4.sh

ファイル名の頭に単語を追加することもできる。例えば、ファイル名の頭に「THE_」という名称を付ける場合は、以下のようにコマンドを実行する。

rename "" 追加したい単語 対象PATH
[root@test-centos7 test]# ls
ABScript100  ABScript102  ABScript104   ABScript7.sh  ABScript9.sh  CDScript1.sh  CDScript3.sh  CDScript5.sh
ABScript101  ABScript103  ABScript6.sh  ABScript8.sh  CDScript0.sh  CDScript2.sh  CDScript4.sh
[root@test-centos7 test]# rename -v "" THE_ *.sh
`ABScript6.sh' -> `THE_ABScript6.sh'
`ABScript7.sh' -> `THE_ABScript7.sh'
`ABScript8.sh' -> `THE_ABScript8.sh'
`ABScript9.sh' -> `THE_ABScript9.sh'
`CDScript0.sh' -> `THE_CDScript0.sh'
`CDScript1.sh' -> `THE_CDScript1.sh'
`CDScript2.sh' -> `THE_CDScript2.sh'
`CDScript3.sh' -> `THE_CDScript3.sh'
`CDScript4.sh' -> `THE_CDScript4.sh'
`CDScript5.sh' -> `THE_CDScript5.sh'
[root@test-centos7 test]# ls
ABScript100  ABScript103       THE_ABScript7.sh  THE_CDScript0.sh  THE_CDScript3.sh
ABScript101  ABScript104       THE_ABScript8.sh  THE_CDScript1.sh  THE_CDScript4.sh
ABScript102  THE_ABScript6.sh  THE_ABScript9.sh  THE_CDScript2.sh  THE_CDScript5.sh

2.『rename』コマンドがない場合

もし『rename』コマンドが無い環境(Solarisなど)の場合は、forとfind、xargs、mvなどを組み合わせ、置換を行う。

ファイル名の置換を行う場合

find /対象PATH -type f | sed 'p;s/置換前の単語/置換後の単語/' | xargs -n2 mv

実際に、「AAA」から「EF」に置換を行った場合、以下のようになる。

[root@test-centos7 test]# ls -la
合計 8
drwxr-xr-x.  7 root root 4096  7月  4 10:26 .
drwxr-xr-x. 30 root root 4096  7月  3 06:37 ..
drwxr-xr-x.  2 root root    6  7月  3 06:38 EFScript100
drwxr-xr-x.  2 root root    6  7月  3 06:38 EFScript101
drwxr-xr-x.  2 root root    6  7月  3 06:38 EFScript102
drwxr-xr-x.  2 root root    6  7月  3 06:38 EFScript103
drwxr-xr-x.  2 root root    6  7月  3 06:38 EFScript104
-rw-r--r--.  1 root root    0  7月  3 06:37 THE_AAAScript1.ksh
-rw-r--r--.  1 root root    0  7月  3 06:37 THE_AAAScript6.ksh
-rw-r--r--.  1 root root    0  7月  3 06:37 THE_AAAScript7.ksh
-rw-r--r--.  1 root root    0  7月  3 06:37 THE_AAAScript8.ksh
-rw-r--r--.  1 root root    0  7月  3 06:37 THE_AAAScript9.ksh
[root@test-centos7 test]# find ./ -type f | sed 'p;s|AAA|EF|g' | xargs -n2 mv
[root@test-centos7 test]# ls -la
合計 8
drwxr-xr-x.  7 root root 4096  7月  4 10:26 .
drwxr-xr-x. 30 root root 4096  7月  3 06:37 ..
drwxr-xr-x.  2 root root    6  7月  3 06:38 EFScript100
drwxr-xr-x.  2 root root    6  7月  3 06:38 EFScript101
drwxr-xr-x.  2 root root    6  7月  3 06:38 EFScript102
drwxr-xr-x.  2 root root    6  7月  3 06:38 EFScript103
drwxr-xr-x.  2 root root    6  7月  3 06:38 EFScript104
-rw-r--r--.  1 root root    0  7月  3 06:37 THE_EFScript1.ksh
-rw-r--r--.  1 root root    0  7月  3 06:37 THE_EFScript6.ksh
-rw-r--r--.  1 root root    0  7月  3 06:37 THE_EFScript7.ksh
-rw-r--r--.  1 root root    0  7月  3 06:37 THE_EFScript8.ksh
-rw-r--r--.  1 root root    0  7月  3 06:37 THE_EFScript9.ksh

sedを用いているので、同様のコマンドで先頭や末尾に特定の文字列を付与したり、その逆も可能だ。

その他、先頭や末尾に特定のキーワードを付与するだけならば、以下のようにfindとxargs、mvを組み合わせる事でも実現出来る。 …rename使えないと、ちょっと書き方が面倒だなぁ

ファイル名の先頭にキーワードを付け加える

find /作業するPATH -type f -print0 | awk -F/ '{print $NF}' | xargs -I% mv 作業するPATH/% 作業するPATH/付与したい単語%

ファイル名の末尾にキーワードを付け加える

find /作業するPATH -type f -print0 | xargs -0 -I% mv % %付与したい単語

ファイル名の先頭にあるキーワードを削除する

find /作業するPATH -type f -print0 -name "削除したい単語*" | perl -pe 's/削除したい単語//g' | xargs -0 -I% mv 削除したい単語% %

ファイル名の末尾にあるキーワードを削除する

find /作業するPATH -type f -print0 -name "*削除したい単語" | perl -pe 's/削除したい単語//g' | xargs -0 -I% mv %削除したい単語 %