使用 Perl 删除除最新缓存文件外的所有文件

Delete All But Newest Cache File using Perl

我有一个 Perl 子例程,可以自动缩小和缓存 JavaScript 和 CSS 文件。为了解决浏览器缓存问题,它将当前的纪元时间放在提供给浏览器的缓存文件的名称之前,例如1625006582-weather.css.

我最初的计划是在创建新缓存之前立即使用 unlink </path/to/cache/*-weather.css> 删除所有旧副本。然而,这意味着有一个时刻,尽管它可能很微小,但没有任何副本是公开可用的(更长,如果新版本的创建失败)。

所以,我想做的是找出最有效的方法,通过删除 *-weather.css minus 来清理我的维护脚本最近的副本。我想我可以遍历目录,然后一次取消一个链接,直到我到达最后一个匹配项,但不知何故我怀疑有一种更有效的方法来做到这一点。有吗?

chdir($fullpath);
@files = glob("*-weather.css");

for (my $I; $I++; $I > $#files) {
    unlink ($fullpath . $files[$I]);
}

不能保证最新的文件是 glob 返回的第一个文件。

use Sort::Key::Natural qw( natsort );

my @qfns = natsort glob("*-weather.css");
pop(@qfns);  # We don't want to delete the newest.
unlink(@qfns);