再帰置換するシェルスクリプト – ファイル名 と 中身

概要

再帰的処理を行い、置換をするプログラムを2つ作りました。

  1. ファイルの中身を変更
  2. ファイル名を変更

0. ワンライナーあった

find . -name "*.html" -type f -exec sed -i '' -e 's/TextToReplace/ReplacementText/' {} \;

1. ファイルの中身を変更

Archive of: ページが見つかりませんでした –
Rails, Web Services, Software Development, Startups
#!/bin/bash

#-----------------------------------------------
# Replace SEARCH string with REPLACEMENT string for the contents.
USAGE="Usage: % ./replace_contents.sh search replacement"
#
# @author Yuki Matsukura
# @version $Id:$
#-----------------------------------------------

# String of partical match
FILEMATCH="*"

# String of partical match
SEARCH=$1

# String of replacement
REPLACEMENT=$2

if [ $# -ne 2 ]; then
  echo "Insufficient parameter error" 1>&2
  echo $USAGE 1>&2
  exit 1
fi




for i in `find . -type f -name "*$FILEMATCH*"`
do
  # contents replacement
  TEMPFILE=`mktemp`
  sed "s/$SEARCH/$REPLACEMENT/g" $i > $TEMPFILE
  mv $TEMPFILE $i 

done

2. ファイル名を変更

Archive of: ページが見つかりませんでした –
Rails, Web Services, Software Development, Startups
#!/bin/bash

#-----------------------------------------------
# Replace SEARCH string with REPLACEMENT string for filename.
USAGE="Usage: % ./replace_filename.sh search replacement"
#
# @author Yuki Matsukura
# @version $Id:$
#-----------------------------------------------

# String of partical match
SEARCH=$1

# String of replacement
REPLACEMENT=$2

if [ $# -ne 2 ]; then
  echo "Insufficient parameter error" 1>&2
  echo $USAGE 1>&2
  exit 1
fi


for i in `find . -type f -name "*$SEARCH*"`
do
  # file name replacement
  REPLACEMENT_FILE=`echo $i | sed "s/$SEARCH/$REPLACEMENT/g"`
  mv $i $REPLACEMENT_FILE

done
[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)
定番の1冊『シェルスクリプト基本リファレンス』の改訂第3版。 シェルスクリプトの知識は、プログラマにとって長く役立つ知識です。 本書では、複数のプラットフォームに対応できる移植性の高いシェルスクリプト作成に主眼を置き、 基本から丁寧に解説。...

コメント

  1. HeliosReds より:

    ファイル名を再帰的に一括置換するためのスクリプトを探していて、こちらに辿り着きました。早速利用させていただいてます。

    …しかし、このスクリプトだと、ディレクトリ名にスペースが入ってしまっているサブディレクトリ以下のファイルのリネームには失敗してしまいますね。

    # Samba サーバーだと、ユーザーがそういうフォルダを作ってしまいやすい。

    「こうすればいい」という解を提示することができなくて恐縮ですが、パスにスペースが入ってしまっている場合にどうするかというギミックを追加できると嬉しいですね。

  2. Yuki Matsukura より:

    すいません。そこまで想定していませんでした。

    運用で回避という、エンジニアらしからぬ発言ですが、下のディレクトリへcdしてからやるとか。。。。

    うさぎ好きですか?飼ってます!
    https://twitter.com/milklog