UNIX・Linuxでファイル名・フォルダ名の一括置換を行う
LinuxやUNIXを利用していると、スクリプト名などのファイル名のルールが変更したため、一括で置換を行いたいときがある。
そんな時は、どうすればいいのだろうか?
1.『rename』コマンドを利用する
もし『rename』コマンドがあるようならば、これを利用するといいだろう。
Linuxには大体最初から用意されている。
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
Sponsored Links
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 %削除したい単語 %