Shammer's Philosophy

My private adversaria

大量ファイル一括編集スクリプト

非常に多くのテキストファイルの一部のみ変更したい、そんな場合に使うスクリプトを書いた。流れとしては、

  1. 編集対象ファイルのあるディレクトリをリストアップ
  2. そのディレクトリ内のファイルにある編集したい文字をsedで置換

というシンプルなものだが、念のためメモ。

#!/bin/bash

change-style () {
    if [ -f $1 ]; then
        mv $1 $1.original
        sed "s/target_strings/replaced_strings/g" $1.original > $1
        rm $1.original
    fi
}

ls -RF ~/somedirectory/ | grep / | sed "s/://g" > targets

count=0
while read line; do
    ARRAY[$count]=$line
    count=`expr $count+1`
done < targets

i=0
while (( $i < $count ))
do
    change-style ${ARRAY[$i]}/A.txt
    change-style ${ARRAY[$i]}/B.txt
    change-style ${ARRAY[$i]}/C.txt
    i=`expr $i + 1`
done
rm targets

/bin/sh ベースだったものを /bin/bash にそのまましたから、おそらく bash では死語に近い(?)expr とか残ってしまっているがとりあえず動作することを確認した。この例だと、~/somedirectory/以下のA.txt、B.txt、C.txt内のtarget_stringsがreplaced_stringsに置き換わる。somedirectory以下にサブディレクトリが複数あって、そのそれぞれのディレクトリにA.txt、B.txt、C.txtがあり、それらを一括で変換したいような場合に使えるスクリプト。自分の仕事の中でこういったシーンに出くわすことがあるので書いてみた。これでかなりの時間削減ができそうだ。