Getting and Setting Timestamps
Problem
You need to retrieve or alter when a file was last modified (written or changed) or accessed (read).
Solution
Use
stat
to get those times
and utime to set them. Both functions are built
into Perl:
($READTIME, $WRITETIME) = (stat($filename))[8,9]; utime($NEWREADTIME, $NEWWRITETIME, $filename);
Discussion
As explained in the Introduction, three different times are
associated with an inode in the traditional Unix filesystem. Of
these, any user can set the atime and
mtime with utime, assuming the
user has write access to the parent directory of the file. There is
effectively no way to change the ctime. This
example shows how to call utime:
$SECONDS_PER_DAY = 60 * 60 * 24;
($atime, $mtime) = (stat($file))[8,9];
$atime -= 7 * $SECONDS_PER_DAY;
$mtime -= 7 * $SECONDS_PER_DAY;
utime($atime, $mtime, $file)
or die "couldn't backdate $file by a week w/ utime: $!";You must call utime with both
atime and mtime values. If you
only want to change one, you must call stat first
to get the other:
$mtime = (stat $file)[9]; utime(time, $mtime, $file);
This is easier to understand if you use File::stat:
use File::stat; utime(time, stat($file)->mtime, $file);
Use utime to make it appear as though you never
touched a file at all (beyond its ctime being
updated). For example, to edit a file, use the program in Example 9.0.
Example 9-1. uvi
#!/usr/bin/perl -w # uvi - vi a file without changing its access times $file = shift or die "usage: uvi filename\n"; ($atime, $mtime) ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access