#!/usr/bin/perl # ホームページ管理用cgi****************************************## ファイル/ディレクトリのパーミションをまとめて変更# use warnings; # 警告表示 # use strict; # 構文チェック # # # # # # HTML Front***************************************************## HTML文前部 # print 'Content-type: text/html'."\n\n"; # HTML出力 # # # print < FileUpdate1.0

done?

HF #/HTML Front***************************************************## # # Chmod Exec***************************************************## パーミション変更部 # my $cd = "."; # 開始ディレクトリ # # # &D1::drive( $cd ); # D1パッケージのdrive関数を呼び出す # #/Chmod Exec***************************************************## # # HTML Rear****************************************************## HTML文後部 # print < HR #/HTML Rear****************************************************## # # Package D1***************************************************## D1パッケージ # { # # package D1; # 微妙なオブジェクト指向 # # # use constant DIR => 1; # 定数定義: ファイルタイプを判別する # # Sub Drive****************************************************## サブルーチン 検索と処理 # sub drive # 再帰が必要なので、サブルーチンで # { # # my $fileName = ""; # ファイル/ディレクトリ名 # my @files = <$_[0]/*>; # 指定ディレクトリ内のファイルリストを得る # my @stat = (0); # ファイル/ディレクトリの情報を得る # my $out = 0; # 表示用 # my $type = 0; # ファイルタイプ判定用 # # # foreach $fileName (@files) # ファイルリストのすべてに対して # { # # @stat = stat( $fileName ); # ファイル/ディレクトリの情報を取得 # # # if( 0100000 == (077777000 & $stat[2]) ) # 対象が通常ファイルかどうか # { # 対象が通常ファイルの場合 # print "ファイル名: $fileName
"; # ファイル名表示 # &D1::fileMod( $fileName, $stat[7] ); # 通常ファイル操作サブルーチンを呼び出す # } # # elsif( 040000 == (077777000 & $stat[2]) ) # 対象がディレクトリかどうか # { # 対象がディレクトリの場合 # chmod( 0705, $fileName ) # パーミションの変更 # or print( "chmod : $!
" ); # 失敗時のエラー表示 # print "ディレクトリ名: $fileName
"; # ディレクトリ名表示 # $type = DIR; # ディレクトリは後で再帰を行うため # } # # else # その他の場合 # { # stat情報の3番目を8進数にした下3桁がパーミション # chmod( 0704, $fileName ) # パーミションの変更 # or print( "chmod : $!
" ); # 失敗時のエラー表示 # print "タイプ不明: $fileName
"; # ビット演算から強引に判定をしたが、一般的かは不明 # } # # # # foreach $out (@stat) # stat情報リストのすべてに対して # { # # print "$out
"; # 表示 # } # # print "
"; # 表示(改行) # # # if( 1 == $type ) # ディレクトリと判定されたかどうか # { # ディレクトリと判定された場合 # &D1::drive( $fileName ); # 再帰呼び出し # $type = 0; # 判定結果を元に戻す # } # # } # # # # return 0; # 処理終了 # } # # #/Sub Drive****************************************************## # # Sub FileMod**************************************************## サブルーチン 通常ファイルへの処理 # sub fileMod # 通常ファイルに対する操作 # { # # my $fileName = $_[0]; # ファイル名 # my $fileSize = $_[1]; # ファイルサイズ # # # if( (rindex( $fileName, ".htm" ) >= 0) || # html形式のファイルかどうか # (rindex( $fileName, ".html" ) >= 0) ) # # { # html形式のファイルの場合 # chmod( 0604, $fileName ) # パーミションの変更 # or print( "chmod : $!
" ); # 失敗時のエラー表示 # # # &D1::htmMod( $fileName, $fileSize ); # html形式ファイル操作サブルーチンを呼び出す # } # # elsif( (rindex( $fileName, ".cgi" ) >= 0) || # CGI実行ファイルかどうか # (rindex( $fileName, ".pl" ) >= 0) ) # # { # CGI実行ファイルの場合 # chmod( 0700, $fileName ) # パーミションの変更 # or print( "chmod : $!
" ); # 失敗時のエラー表示 # } # # elsif( (rindex( $fileName, ".dat" ) >= 0) || # データファイルかどうか # (rindex( $fileName, ".DAT" ) >= 0) ) # # { # データファイルの場合 # chmod( 0600, $fileName ) # パーミションの変更 # or print( "chmod : $!
" ); # 失敗時のエラー表示 # } # # else # その他の場合 # { # サーバの推奨設定に従いましょう # chmod( 0604, $fileName ) # パーミションの変更 # or print( "chmod : $!
" ); # 失敗時のエラー表示 # } # # # # return 0; # 処理終了 # } # # #/Sub FileMod**************************************************## # # Sub HtmMod***************************************************## サブルーチン html形式ファイルへの処理 # sub htmMod # html形式ファイルに対する操作 # { # # my $buf = ""; # 作業領域 # my $fileName = $_[0]; # ファイル名 # my $fileSize = $_[1]; # ファイルサイズ # # # # open( INFO, "<$fileName" ) # ファイルオープン(読込み専用) # # or die( "INFO : $!
" ); # 失敗時のエラー処理 # # flock( INFO, 1 ) # 共有ロック(LOCK_SH == 1) # # or print( "flock : $!
" ); # 失敗時のエラー表示 # # read( INFO, $buf, $fileSize ); # ファイル内容を変数に読込む # # close( INFO ); # ファイルクローズ # # # # # $buf =~ s/2005-2007/2005-2008/g; # 特定文字列を置換する # # # # # open( OUFO, ">$fileName" ) # ファイルオープン(書込み専用) # # or print( "INFO : $!
" ); # 失敗時のエラー表示 # # flock( OUFO, 2 ) # 排他ロック(LOCK_EX == 2) # # or print( "flock : $!
" ); # 失敗時のエラー表示 # # print OUFO $buf; # 置換後の内容をファイルに上書く # # close( OUFO ); # ファイルクローズ # # # open( IOFO, "+<$fileName" ) # ファイルオープン(読込み両用) # or die( "IOFO : $!
" ); # 失敗時のエラー処理 # flock( IOFO, 2 ) # 排他ロック(LOCK_EX == 2) # or print( "flock : $!
" ); # 失敗時のエラー表示 # read( IOFO, $buf, $fileSize ); # ファイル内容を変数に読込む # # # $buf =~ s/2005-2007/2005-2008/g; # 特定文字列を置換する # # # # 以下の2行は、ファイルのオープン/クローズ回数を減らす工夫。ただし、性能にどう影響するかは未解析。 # # 上書きと同じ結果を得る目的で、ファイル内容のクリアおよびファイル先頭へのポインタセットを行っている。 # seek( IOFO, 0, 0 ); # ポインタをファイルの先頭にセット # truncate( IOFO, 0 ); # ファイル内容を消去 # # # print IOFO $buf; # 置換後の内容をファイルに書き込む # close( IOFO ); # ファイルクローズ # # # return 0; # 処理終了 # } # # #/Sub HtmMod***************************************************## # 1; # パッケージ使用時のおまじない? # } # # #/Package D1***************************************************## # package main; exit;