プロが教える店舗&オフィスのセキュリティ対策術

Perlを使って、下のようなイメージでディレクトリ内のファイル名と更新日付のみ取得したいと思っております。

(ファイル名)△(更新日付)

最初は、PerlからUNIXコマンドを呼び出してls -ltr の結果を配列に格納し、それから半角スペースを元にsplitして取得しようとしたのですが、
日付が一桁のときと二桁のときでは、配列の位置が異なるため、うまくいかないのです。

また、stat関数を使ったのですが、情報はなにも取得されません。理由は不明です。

他に良い方法をご存知の方、御教示願えないでしょうか?
ちなみにPerlのバージョンは4、OSはHP-UXです。

情報不足だったり意味が分からなかったら追記いたします。
よろしくお願いします。

A 回答 (5件)

statで情報が取得できなかったということですが、


どのようにstatを使用しましたでしょうか。
以下は、ARGV[0]にファイ名を与えた時に、
更新時刻を求めるスクリプトです。
--------------------------------
$filename = $ARGV[0];
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks)
= stat($filename);

print("modify time=$ctime\n");
($sec,$min,$hour,$day,$month,$year,$wday,$yday,$idst)=localtime($ctime);
$yy = $year + 1900;
$mm = $month + 1;
print("modify time=$yy-$mm-$day $hour:$min:$sec\n");

--------------------------------
Perlのバージョンは4、OSはHP-UXで確認済です。
#1のかたが言われているように、statに正しいファイル名を指定しなければ当然、正しい結果は、得られません。まずは、正しいファイルを指定しているか、確認なさって下さい。
    • good
    • 0

#3です。


#4の方のおっしゃるとおりです。
更新時刻は$mtimeを使用して下さい。
大変、貴重なご指摘、ありがとうございました。
間違いましたので、自信なし。
    • good
    • 0

#3の方の$ctimeは更新時間ではありません。


作成時間かと思います
    • good
    • 0

やはり、statを使うといいと思います。


statが取得できないのは、ワークディレクトリが違うとか言うことはないでしょうか
一応statを使った現在ディレクトリ(.)のファイル名と更新日付の表示するものを作ってみました。

opendir(aDir, ".");
foreach(grep(!/^\.{1,2}$/,readdir(aDir))){
my @ltime = localtime((stat $_ )[9]);
my $modifyTime = sprintf("%d年%d月%d日%02d時%02d分%02d秒",
$ltime[5]+1900,$ltime[4]+1,$ltime[3],$ltime[2],$ltime[1],$ltime[0]);
print "$_ $modifyTime\n";
}
closedir(wkDir);
    • good
    • 0

全然わかりませんが、statで情報が取得できなかったということで・・・


経験上、その手の処理でわりとよく見るケアレスミスがありますので該当していないか確認してください。

opendir DIR,$path;
while ($entry = readdir DIR ) {
@status = stat $entry;
~~~
}
close DIR;

↑このようなミスをしている場合がある。
@status = stat "$path/$entry";
が正解。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!