如何用PHP给文件夹中所有无扩展名文件添加统一扩展名?
批量给无扩展名文件添加通用扩展名的解决方案
你的原代码存在几个核心问题导致无法正常运行:
- 正则匹配逻辑偏差:
@^((?!webm).)*$@i会把带路径的条目(比如./asset/test)整体纳入判断,而且会选中所有不含webm字符的文件——包括带其他扩展名的,不是只筛选无扩展名的目标文件。 - 未过滤目录:
glob($dir . '*')会返回目录下的文件和子目录,直接重命名目录会触发错误。 - 缺少失败反馈:如果PHP进程没有目录读写权限,重命名操作会静默失败,无法定位问题。
下面是修正后的代码,能精准给无扩展名文件添加.webm扩展名:
<?php $dir = './asset/'; // 获取目录下所有文件和目录条目 $items = glob($dir . '*'); foreach ($items as $item) { // 跳过目录,只处理文件 if (!is_file($item)) { continue; } $filename = basename($item); // 筛选完全没有扩展名的文件(文件名中不含.) if (strpos($filename, '.') === false) { // 执行重命名并输出结果,方便排查问题 if (rename($item, $item . '.webm')) { echo "已重命名:$item -> $item.webm\n"; } else { echo "重命名失败:$item\n"; } } } ?>
关键优化说明:
- 用
is_file()过滤目录,避免误操作子目录 - 用
strpos($filename, '.') === false精准识别无扩展名的文件 - 添加了重命名结果的输出,便于快速定位失败原因
- 如果要排除已有的
.webm文件,可补充判断:// PHP 8.0+版本可用 if (strpos($filename, '.') === false && !str_ends_with($item, '.webm')) { // PHP 8.0以下版本兼容写法 if (strpos($filename, '.') === false && substr($item, -5) !== '.webm') {
操作注意事项:
- 先备份目标目录的文件,避免批量操作出错导致数据丢失
- 确保运行PHP的进程对
./asset/目录有读写权限 - 命令行环境直接执行
php your_script.php即可;网页环境运行时,注意隐藏脚本路径,避免安全风险
内容的提问来源于stack exchange,提问作者Yidi
相关产品推荐
相关产品推荐

