mieki256's diary



2005/08/03(水) [n年前の日記]

#5 [prog][digital] Perlでタイムスタンプ変更スクリプトを作成してみたり

あちらこちらからコピペして作成。

カレントフォルダ中の .bmp ファイルに対して、更新日時の『日付部分のみ』を、指定した日付に変更。「perl tmstchg.pl 2005 08 03」みたいな感じで使う。
#!/usr/bin/perl
# Last updated: <2005/08/03 22:21:13 +0900>
#
# tmstchg.pl - タイムスタンプ変更スクリプト。日付のみ変更する
#
# usage : perl tmstchg.pl YYYY MM DD

use strict;
use POSIX 'strftime';

my $ext = "bmp";

my ($now_sec,$now_min,$now_hour,
    $mday_new,$mon_new,$year_new,
    $now_wday,$now_yday,$now_isdst) = localtime(time);

$year_new += 1900;
$mon_new += 1;

my $listonly = 0;

if ( $#ARGV != 2 ) {
    usage();
    $listonly = 1;
} else {
    my $yy = shift @ARGV;
    my $mm = shift @ARGV;
    my $dd = shift @ARGV;

    if ( $yy < 2005 || $mm < 1 || $mm > 12 || $dd < 1 || $dd > 31 ) {
        usage();
        $listonly = 1;
    } else {
        $year_new = $yy;
        $mon_new = $mm;
        $mday_new = $dd;
    }
}

my @files = glob("*.$ext");

foreach my $file (@files) {
    my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
        $atime, $mtime, $ctime, $blksize, $blocks) = stat $file;

    my $atimestr = strftime "%Y/%m/%d %H:%M:%S", localtime $atime;
    my $mtimestr = strftime "%Y/%m/%d %H:%M:%S", localtime $mtime;

    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime $mtime;

    my $mmtime = get_time($year_new,$mon_new,$mday_new,$hour,$min,$sec);
    my $mmtimestr = strftime "%Y/%m/%d %H:%M:%S", localtime $mmtime;

    print "$file\t$atimestr\t$mtimestr";

    if ( $listonly == 0 ) {
        print "\t->\t$mmtimestr";
        utime($atime, $mmtime, $file);
    }

    print "\n";
}

print "\npush any key";
my $c = getc;

exit;


sub get_time {
    my($yy,$mm,$mday,$hour,$min,$sec) = @_;
    my($time, $year, $mon, $tz, $uruu, @mdays);

    $year = $yy - 1900;
    $mon = $mm - 1;

    $tz = -9;

    @mdays = ( 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
    $uruu = int(($year - 72) / 4);
    if (((($year + 1900) % 4) == 0) && ($mon < 2)) {
        $uruu--;
    }

    $time = $year - 70;
    $time = ($time * 365) + $mdays[$mon] + $mday + $uruu;
    $time = ($time * 24) + $hour + $tz;
    $time = ($time * 60) + $min;
    $time = ($time * 60) + $sec;

    return $time;
}

sub usage {
    print "usage : perl tmstchg.pl YYYY MM DD\n\n";
}
無駄なところがありすぎだけど。まあ、勉強も兼ねて。

ついでに、あふから呼べるようにしたり。下のようなテキストファイルを作成。
afx Perl Script MENU
"t タイムスタンプ(日付のみ)変更"     cmd.exe /c perl x:\xxxx\tmstchg.pl $I"Year (ex. 2005)" $I"Month (ex. 07)" $I"Day (ex. 03)"
やってることは、「年」「月」「日」の入力ウインドウを出して、それをperlスクリプトに渡す、といった感じ。更に、ファンクションキーに以下のような感じでコマンドを割り当て。
&menu x:\xxxx\menu_perlscript.txt

以上です。

過去ログ表示

Prev - 2005/08 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project