namazu-ml(avocado)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

settime.pl



岸です。少しは貢献しなくちゃ。

Last-Modified を返さない Web Server の場合、
ロボットでコンテンツを取得するとファイルの更新時間は取得した時間になります。

このスクリプトはあるディレクトリ以下を調べて、
前回実行時とファイルの内容に差がなければ、
ファイルの更新時間を前回実行時のものに戻す、というものです。

ロボットでコンテンツを取得した後、
mknmz を走らせる前にこのスクリプトを走らせると、
mknmz の時間短縮および、Date: フィールドがちょっとだけマシになります。

一回目だけ全部のファイルの md5 をとるので時間がかかります。
二回目以降は更新時間の変わったものだけ md5 をとります。

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

use MD5;
$md5 = new MD5;

$file = 'digest';
$dir = '/usr/local/SYSTEM/mirror';
$cmd_find = '/usr/bin/find';

undef %old;
if (open(IN, $file)) {
    while (<IN>) {
	chomp;
	split(/\t/, $_, 2);
	$old{$_[0]} = $_[1];
    }
    close(IN);
}

open(IN, "$cmd_find $dir -type f -print |") || die "Can't exec $cmd_find";
open(OUT, "> $file.new") || die "Can't open $file.new";
while ($f = <IN>) {
    chomp($f);
    @stat = stat($f);
    $mtime = $stat[9];
    $size = $stat[7];
    if (defined($old{$f})) {
	($mtime_old, $size_old, $digest_old) = split(/\t/, $old{$f});
	if ($mtime == $mtime_old && $size == $size_old) {
	    $digest = $digest_old;
	} else {
	    open(F, $f) || next;
	    $md5->reset;
	    $md5->addfile(F);
	    $digest = $md5->hexdigest;
	    close(F);
	    if ($size == $size_old && $digest eq $digest_old) {
		$mtime = $mtime_old;
		utime(time, $mtime, $f);
	    }
	}
    } else {
	open(F, $f) || next;
	$md5->reset;
	$md5->addfile(F);
	$digest = $md5->hexdigest;
	close(F);
    }
    print OUT join("\t", $f, $mtime, $size, $digest)."\n";
}
close(OUT);
close(IN);

if (-e $file) {
    rename($file, "$file.old") || die "Can't rename $file";
}
rename("$file.new", $file) || die "Can't rename $file.new";

exit 0;

--
ソニー株式会社 映像ソフトセンター ホームページ室	岸 康司
		kis@xxxxxxxxxxxxxxxxx || kis@xxxxxxxxx