在服务器运维或项目迁移时,经常会遇到需要把某个文件夹里所有以特定字符串开头的文件名批量改成另一个前缀的情况。php自带丰富的文件和正则函数,可以很轻松地完成遍历目录与正则替换文件名的任务。

一、核心思路说明
实现批量替换文件名前缀一般分为三步:第一,用目录操作函数打开并遍历目标文件夹;第二,用正则表达式判断文件名是否包含需要被替换的前缀;第三,用rename函数将旧文件重命名为新文件。下面分别展开说明。
1. 遍历目录读取文件
php中可以使用opendir配合readdir来列出目录中的条目,注意要过滤掉表示当前目录和上级目录的点的名称。
2. 正则匹配旧前缀
假设我们要把test_开头的文件改为new_开头,可以用preg_match判断,再用preg_replace提取并替换前缀部分。
3. 执行重命名
重命名前务必确认新文件名在目录中不存在,防止覆盖已有文件造成数据丢失。
二、完整示例代码
以下脚本演示了如何批量将某目录下以old_开头的文件前缀替换为new_:
<?php
// 目标目录路径,根据实际需要修改
$dir = '/var/www/upload/';
// 打开目录
$handle = opendir($dir);
if ($handle === false) {
die('无法打开目录');
}
// 旧前缀和新前缀
$oldPrefix = 'old_';
$newPrefix = 'new_';
// 遍历目录
while (($file = readdir($handle)) !== false) {
// 跳过特殊目录项
if ($file == '.' || $file == '..') {
continue;
}
// 仅处理文件,不处理子目录
if (!is_file($dir . $file)) {
continue;
}
// 用正则匹配以old_开头的文件名
if (preg_match('/^old_(.+)$/', $file, $matches)) {
$newName = $newPrefix . $matches[1];
$oldPath = $dir . $file;
$newPath = $dir . $newName;
// 避免新文件名已存在
if (file_exists($newPath)) {
echo '跳过,已存在: ' . $newName . PHP_EOL;
continue;
}
// 执行重命名
if (rename($oldPath, $newPath)) {
echo '重命名成功: ' . $file . ' => ' . $newName . PHP_EOL;
} else {
echo '重命名失败: ' . $file . PHP_EOL;
}
}
}
closedir($handle);
?>
三、正则匹配的灵活用法
如果前缀不是固定字符串,而是某种规律,比如日期开头(20240101_xxx.jpg),可以用更通用的正则。下面的例子把形如数字日期前缀改为d_:
<?php
$dir = '/var/www/logs/';
$handle = opendir($dir);
while (($file = readdir($handle)) !== false) {
if ($file == '.' || $file == '..') continue;
if (!is_file($dir . $file)) continue;
// 匹配8位数字开头的前缀
if (preg_match('/^(d{8})_(.+)$/', $file, $m)) {
$newName = 'd_' . $m[2];
rename($dir . $file, $dir . $newName);
}
}
closedir($handle);
?>
四、注意事项
- 脚本运行用户需要对目录和文件有读写权限,否则rename会失败。
- 建议先在测试目录试运行,或把rename改为打印新文件名来确认逻辑正确。
- 若文件名包含中文,要确保php文件及系统环境使用UTF-8编码,避免乱码。
- 处理大量文件时,可适当加入计数和错误日志,方便排查问题。
通过上述方法,利用php遍历目录与正则匹配,就能高效且安全地批量替换文件名前缀,满足日常自动化处理需求。