Simpler Navigation for Servers and Operating Systems
Completed: a much simpler Servers and Operating Systems section of the Community. We combined many of the older boards, so you won't have to click through so many levels to get at the information you need. Check the consolidated boards here as many sub-forums are now single boards.
Languages and Scripting
cancel
Showing results for 
Search instead for 
Did you mean: 

Need to find the time difference between the file tmp_071508 cretaed and the current time

Highlighted
Manish Pandey
Valued Contributor

Need to find the time difference between the file tmp_071508 cretaed and the current time

I has create a script, which will create the file with name tmp_($date +%H%M%S).I want to create the script to know the time difference, when the file was created and the current time.
"Plans Never Fails, People Fails To Plan"
3 REPLIES
James R. Ferguson
Acclaimed Contributor

Re: Need to find the time difference between the file tmp_071508 cretaed and the current time

Hi Manish:

# perl -le 'die unless -f $ARGV[0];print +(time-(stat($ARGV[0]))[9])," seconds ago"' file

# touch /tmp/me
# perl -le 'die unless -f $ARGV[0];print +(time-(stat($ARGV[0]))[9])," seconds ago"' /tmp/me
2 seconds ago

Regards!

...JRF...
Hein van den Heuvel
Honored Contributor

Re: Need to find the time difference between the file tmp_071508 cretaed and the current time


The solution JRF proposes is probably fine.
But pleae realize that it relies on stat[9] = mtime = "last modify time in seconds since the epoch, " to be close to the creation time (which Unix does not record).

It does NOT use the time in the name.
So this only works fine for marker file which is created and not touched anymore.

A more exact, but much more tedious, solution would be to take the name apart into time component, stuff in time array and get the seconds since epoch.

For example:

#---- test.pl ------
$_=shift;
m/(\d+)(\d\d)(\d\d)$/;
$then = $3 + $2*60 + $1*3600;
@now=localtime;
$now = $now[0] + $now[1]*60 + $now[2]*3600;
print $now - $then, " Seconds\n";
#-------------------

Or a little cleaner still

#---- test.pl ------
use Time::Local;

$now=time;
$_=shift;
m/(\d+)(\d\d)(\d\d)$/;
@then=localtime($now);
@then[0..2]=($3,$2,$1);
$then=timelocal(@then);
print $now - $then, " Seconds\n";
#------------------------

$ cat > tmp_$(date +%H%M%S)
test
$ sleep 10
$ ls tmp_*
tmp_142711
$ perl test.pl tmp_142711
11 Seconds

Of course, the design of the file name will cause this only to work 'today'.
If you ever need to cross a day boundary, then you may want to add something like

$elapsed = $now - $then;
$elapsed +=86400 if $elapsed < 0;

hth,
Hein.
James R. Ferguson
Acclaimed Contributor

Re: Need to find the time difference between the file tmp_071508 cretaed and the current time

Hi (again) Manish:

We could also invoke the Date::Calc module to do:

# cat .fileage
#!/usr/bin/perl
use strict;
use warnings;
use Date::Calc qw( Delta_DHMS );
die "Usage: $0 file\n" unless @ARGV && -f $ARGV[0];
my $file = shift;
my ( $fsec, $fmin, $fhrs, $fday, $fmon, $fyrs )
= ( localtime( ( stat($file) )[9] ) )[ 0 .. 5 ];
my ( $csec, $cmin, $chrs, $cday, $cmon, $cyrs ) = (localtime)[ 0 .. 5 ];
$fmon++;
$fyrs += 1900;
$cmon++;
$cyrs += 1900;
my ( $Dd, $Dh, $Dm, $Ds ) = Delta_DHMS(
$fyrs, $fmon, $fday, $fhrs, $fmin, $fsec,
$cyrs, $cmon, $cday, $chrs, $cmin, $csec
);
printf "'%s' is %d day%s %d hour%s %d minute%s %d second%s old\n",
$file, $Dd, $Dd == 1 ? "" : "s", $Dh, $Dh == 1 ? "" : "s", $Dm,
$Dm == 1 ? "" : "s", $Ds, $Ds == 1 ? "" : "s";
1;


# ls -l /stand/vmunix
-rwxr-xr-x 1 root sys 18949752 Mar 3 15:16 /stand/vmunix
# ./fileage /stand/vmunix
'/stand/vmunix' is 133 days 2 hours 15 minutes 14 seconds old

Regards!

...JRF...