You need to retrieve or alter when a file was last modified (written or changed) or accessed (read).
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);
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.1.
#!/usr/bin/perl -w # uvi - vi a file without changing its access times $file = shift or die "usage: uvi filename\n"; ($atime, $mtime) = (stat($file))[8,9]; system($ENV{EDITOR} || "vi", $file); utime($atime, $mtime, $file) or die "couldn't restore $file to orig times: $!";
The stat
and utime
functions in perlfunc (1) and in Chapter 3 of Programming Perl; the standard File::stat module (also in Chapter 7 of Programming Perl; your system's utime (3) manpage
Copyright © 2001 O'Reilly & Associates. All rights reserved.