68user's page 掲示板

Prev< No. 2276> Next  [最新発言に戻る] [過去ログ一覧]
No. 2276 # ふくし [E-mail] 2001/11/19 (月) 13:48:26
みーさん:

なんかすいません。
たぶんぼくのやり方すごく非標準的なので、
もっとカッコいい方法はいくらでもあると思うんですが、、

find はファイル名の検索、
grep はファイルの中の文字列の検索、
で、合ってます。
ぼくのスクリプトでは各ファイルの中での文字列検索/置換を
自分で書いています。(while のあたり)

#! /usr/local/bin/perl -w
# kokyakuokyaku

$tmp = "TempFileDayooon"; # 中間ファイル。存在しないファイル名を選ぶこと

for $file (`find . -print`) {
                  chomp $file; # すいません、ココ、間違ってました
                  if (-f $file) {
                                  open FILE, $file;
                                  open TMP, ">$tmp";
                                  while (<FILE>) {
                                                  s|/srv/kokyaku/|/srv/okyaku/|g;
                                                  print TMP;
                                  }
                                  close TMP;
                                  close FILE;
                                  rename $tmp, $file;
                  }
}

`UNIXコマンド`
    …バッククォート(`)でUNIXのコマンドを囲むと、
        出力結果をリストで返す

for $変数 (リスト) {
    ...なんだかんだ...
}
    …リストの要素を1個ずつ $変数 に入れながら、
        「なんだかんだ」の部分を繰り返す。
        上では find の結果を1行ずつ $file に入れて処理している。
        それはカレント ディレクトリ以降のファイル/ディレクトリである。

% find . -print
    …カレント ディレクトリ以降のファイル/ディレクトリを一覧表示する。

chomp $file;
    …$file(find の結果の1行)の末尾から改行を取り除いて、
        ファイル/ディレクトリ名として正しいものにしている

-f 文字列
    …「-f」はファイルテスト演算子のひとつ。
        右に来る文字列がふつうのファイルだったら真を返す。
        ここではディレクトリをはじいている。

open FILE, $file;
    …ファイル名 $file のファイルを入力で開いて、
        ファイルハンドル FILE で入力アクセスできるようにする

open TMP, ">$tmp";
    …ファイル名 $tmp のファイルを出力で開いて、
        ファイルハンドル TMP で出力アクセスできるようにする

while (<FILE>) {
    ...なんだかんだ...
}
    …ファイルハンドル FILE で読み込まれる
        ファイル $file(ここでは find の結果のうち、ファイルのみ)の
        1行1行を、$_ という特殊な変数に入れながら
        「なんだかんだ」の部分を繰り返す。
        $file を読み終わったらループを脱出する

s|/srv/kokyaku/|/srv/okyaku/|g;
    …デフォルトの作用対象である変数 $_ に対して、
        「/srv/kokyaku/」を「/srv/okyaku/」に置換する。
        s は substitute(置換)、g は global(全体的に)の略。
        g を略すと1行に1回しか置換しない

print TMP;
    …TMP ファイルハンドルに、デフォルトの作用対象 $_ を出力する
        ここで $_ は FILE の1行1行に
        「/srv/kokyaku/」=>「/srv/okyaku/」の置換を施したものである

close TMP;
close FILE;
    …ファイルを「閉じる」。
        (ファイルアクセスのために確保されていたメモリなどの資源を解放する)

rename $tmp, $file;
    …置換する前のファイル名が $file、
        置換したあとのファイル名が $tmp なので、
        $tmp を $file に改名する。
        これで置換したファイルで元ファイルは上書きされ、
        中間ファイル TempFileDayooon は消えてなくなる

こんな感じでしょうか。

Prev< No. 2276> Next  [最新発言に戻る] [過去ログ一覧]