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 %削除したい単語 %