Home > other >  Perl Get File Last Modified Date Time No Module
Perl Get File Last Modified Date Time No Module

Time:02-11

I'm creating a script where I need to get the Last Modified Date of the files I checked this thread How do I get a file's last modified time in Perl?

So I used the script below to get the last modified, at first it was working but when I try to run it again, the timestamp returns 00:00 January 1, 1970.

Why is that happening and how can I get the correct last modified date and time?

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;

When I tried to run the perl, I will get this result

  • file.txt Thu Jan 1 00:00:00 1970

  • file2.csv Thu Jan 1 00:00:00 1970

Ok, last update, it is working now, I try to run all of the scripts you've given to me, standalone script. I found what's causing the default time, see the script below, I remove that in my program and it works, didn't notice this at first, sorry. But still, it feels weird because I was sure that it is working when I first run it, but now it is working so yeah thank you guys!

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;

CodePudding user response:

readdir returns file names without the full path. You need to prepend the path manually:

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

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

Also note how I changed the regex to match the file names.

CodePudding user response:

If you have a directory name, and you want to see if some files whose names you already know exist in that directory, there's really no need for opendir/readdir - that's more helpful if you don't know the filenames ahead of time. When you do, you can just build a path using both parts and use file test operators/stat/etc. on it.

#!/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";
    }
}

Example execution:

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

CodePudding user response:

Following demo code utilizes glob to obtain modification time for specified files in a directory.

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);
  • Related