本文详解如何通过 glob() 结合 usort() 和 filemtime() 精准定位并重命名指定目录下最新修改的文件,避免 scandir() 仅按名称排序导致的逻辑错误,并提供安全可靠的正则替换与路径处理方案。
在 PHP 中,仅依赖 scandir() 按字典序降序排列(如 SCANDIR_SORT_DESCENDING)并不能保证获取“最新添加/修改”的文件——因为文件名(如 file_0202.json)的字母顺序与实际时间顺序无关。正确做法是基于文件系统元数据(如最后修改时间)进行排序。
以下为推荐实现方案:
mpty($files)) {
echo 'No files found.';
exit;
}
usort($files, function($a, $b) {
return filemtime($b) <=> filemtime($a); // PHP 7+ 太空船操作符,简洁安全
});
$selected_file = $files[0];
$dir_path = dirname($selected_file);
$basename = basename($selected_file);
// 3. 安全地构造新文件名:仅替换文件名中的下划线编号部分,不触碰路径
$new_basename = preg_replace('/^([^_]+)_([^_.]*)\.([^.]+)$/', '$1.$3', $basename);
$new_filepath = $dir_path . '/' . $new_basename;
// 4. 执行重命名(注意:源和目标必须在同一文件系统,且目标不可存在)
if (rename($selected_file, $new_filepath)) {
echo "Renamed successfully: {$basename} → {$new_basename}";
} else {
echo "Failed to rename: " . error_get_last()['message'] ?? 'Unknown error';
}
?>✅ 关键改进说明:
⚠️ 注意事项:
掌握此模式后,你可轻松扩展为批量处理最新 N 个文件、按时间窗口筛选或集成到定时任务中。