更改文件列表中每个文件的访问和修改时间。列表中的前两个元素必须是数字访问时间和修改时间,顺序如此。返回成功更改的文件数量。每个文件的 inode 更改时间设置为当前时间。例如,当文件 * 已经存在 * 并且属于运行程序的用户时,此代码与 Unix touch(1) 命令具有相同的效果
#!/usr/bin/perl
my $atime = my $mtime = time;
utime $atime, $mtime, @ARGV;
从 Perl 5.8.0 开始,如果列表中的前两个元素是 undef
,则会调用 C 库中的 utime(2) 系统调用,第二个参数为空。在大多数系统上,这将把文件的访问和修改时间设置为当前时间(即等效于上面的示例),并且即使在您不拥有的文件上也能正常工作,只要您有写入权限
for my $file (@ARGV) {
utime(undef, undef, $file)
|| warn "Couldn't touch $file: $!";
}
在 NFS 下,这将使用 NFS 服务器的时间,而不是本地机器的时间。如果存在时间同步问题,NFS 服务器和本地机器将具有不同的时间。Unix touch(1) 命令实际上通常会使用这种形式,而不是第一个示例中显示的形式。
仅将前两个元素中的一个作为 undef
传递等效于传递 0,并且不会产生当两者都为 undef
时所描述的效果。这也会触发一个未初始化警告。
在支持 futimes(2) 的系统上,您可以将文件句柄传递到文件之间。在不支持 futimes(2) 的系统上,传递文件句柄会引发异常。文件句柄必须作为全局变量或全局变量引用传递才能被识别;裸字被视为文件名。
可移植性问题:"perlport 中的 utime"。