2004/11/18(木)

blosxom導入覚え書き・9 〜 過去エントリ登録時の日付修正2

以前、エントリファイルの更新日付を変更するシェルスクリプトを書きましたが、ファイル数が膨大になるといちいちファイル名と更新日付を記述していくのがかったるくなってきます。
そこで、各エントリのファイル名が通常では登録した日付(年月日時分秒)になっている事を利用して、更新日付を変更するPerlスクリプトを書いてみました。

#!/usr/bin/perl
#=====================================================================
# エントリファイルの更新日付をファイル名を参照して変更する。
#=====================================================================

use Time::Local;
use File::Basename;

#----- エントリ格納ディレクトリへの絶対パスまたはこのcgiから見た相対パス
$epath = "../entries/";
#----- エントリファイル拡張子(blosxom starter kitの初期値は「txt」)
$ext = "txt";
#----- 更新されなかったファイル一覧
$nochgfile = "";

print "Content-Type: text/html\n\n";
print "<html><body>\n";
print "更新日付の変更が完了しました。<br>\n";
print "以下の" . getfile($epath) . "件のエントリが更新されませんでした。<br>\n";
print $nochgfile;
print "</body></html>\n";

#----- エントリファイル名取得
sub getfile{
  my($epath) = @_;
  my $cnt = 0;
  opendir(DIR01, $epath);
  @_ = readdir(DIR01);
  closedir(DIR01);

  foreach $_ (@_) {
    if (/^\./){next;}
    if (-d "$epath$_") {
      $cnt = $cnt + &getfile("$epath$_/");
    } else {
      # ファイル名の先頭8桁が数字なら更新日変更
      if (/^[0-9]{8}(.*)\.$ext$/){
        &chgstat("$epath$_");
      } else {
        $cnt++;
        $nochgfile = "$nochgfile$epath$_<br>\n" ;
      }
    }
  }
  return $cnt
}

#----- 更新日付変更
sub chgstat{
  my($file) = @_;
  $date = basename($file);
  $date =~ /^[0-9]{8,14}/;

  $year   = substr($date, 0, 4);
  $month  = substr($date, 4, 2) - 1;
  $day    = substr($date, 6, 2);
  $hour   = substr($date, 8, 2);
  $minute = substr($date, 10, 2);
  $second = substr($date, 12, 2);

  $mdate = timelocal($second, $minute, $hour, $day, $month, $year);
  utime $mdate, $mdate, $file;
}

このスクリプトを実行すれば、ほとんどのエントリファイルの更新日付を変更する事が出来ます。
日付形式でないファイル名のエントリは前回のシェルスクリプトを実行して更新日付を変更すれば良い訳です。

Powered by blosxom 2.0