Perl获取文件上次修改日期时间无模块

bkkx9g8r  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(296)

我正在创建一个脚本,我需要获得我检查此线程How do I get a file's last modified time in Perl?的文件的上次修改日期
所以我使用下面的脚本来获得最后修改的,起初它是工作的,但当我尝试再次运行它,时间戳返回00:00 1970年1月1日。
为什么会发生这种情况?我如何才能获得正确的上次修改日期和时间?

my $dir = '/tmp';
    
opendir(DIR, $dir) or die $!;
@content=readdir(DIR);

foreach(@content)
{
    next unless ($_ =~ m/\bfile.txt|file2.csv\b/);

    my $epoch_timestamp = (stat($_))[9];
    my $timestamp       = localtime($epoch_timestamp);
    $f_detail = $_ .' '.$timestamp;
    print "$f_detail\n";
}
closedir(DIR);
    
exit 0;

当我试图运行perl时,我会得到这样的结果

  • file.txt 1970年1月1日星期四00:00:00
  • file2.csv 1970年1月1日星期四00:00:00

好的,最后一次更新,它现在工作了,我试着运行你给我的所有脚本,独立脚本。我找到了导致默认时间的原因,请看下面的脚本,我在我的程序中删除了它,它工作了,一开始没有注意到这个,对不起。但是,它仍然感觉很奇怪,因为我第一次运行它的时候确信它是工作的,但是现在它是工作的,所以是的,谢谢你们!

if (($month = ((localtime)[4] + 1)) < 10)
{
  $month = '0' . $month;
}
if (($day = ((localtime)[3])) < 10)
{
  $day = '0' . $day;
}
if (($year = ((localtime)[5]+1900)) >= 2000)
{

  if (($year = $year - 2000) < 10)
  {
    $year = '0' . $year;
  }
}
else
{
  $year = $year - 1900;
}

$date = $month . $day . $year;
2g32fytz

2g32fytz1#

readdir返回没有完整路径的文件名。您需要手动在前面加上路径:

for (@content) {
    next unless /^(?:file\.txt|file2\.csv)\z/;

    my $epoch_timestamp = (stat("$dir/$_"))[9];
    #                           ~~~~~~~~~

还请注意我是如何更改regex以匹配文件名的。

lf3rwulv

lf3rwulv2#

如果你有一个目录名,并且你想知道该目录中是否存在一些你已经知道名字的文件,那么就不需要opendir/readdir--如果你事先不知道文件名,这会更有帮助。当你知道文件名时,你可以使用这两个部分建立一个路径,并在其上使用文件测试操作符/stat/etc。

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;

my $dir = '/tmp';
my @files = qw/file.txt file2.csv/;

for my $file (@files) {
    # Better to use File::Spec->catfile($dir, $file), but your question
    # title said no modules...
    my $name = "$dir/$file";
    if (-e $name) { # Does the file exist?
        # _ to re-use the results of the above file test operator's stat call
        my $epoch_timestamp = (stat _)[9]; 
        my $timestamp       = localtime $epoch_timestamp;
        say "$file $timestamp";
    }
}

示例执行:

$ perl demo.pl
file.txt Tue Feb  8 07:26:07 2022
file2.csv Tue Feb  8 07:26:10 2022
taor4pac

taor4pac3#

以下演示代码利用glob获取目录中指定文件的修改时间。

use strict;
use warnings;
use feature 'say';

my $dir   = '/tmp';
my @files = qw(file.txt file2.csv);
my $mask  = join ' ',  map { "$dir/$_" } @files;

say "$_\t" . localtime((stat($_))[9]) for glob($mask);

相关问题