今天受到一位朋友的拜托,他需要把一个目录里的几百个图片批量修改文件名.每个文件名原本都有且至少有三个横杠,要求删除第三个横杠后的字符并保持后缀名不变.

于是我就思考起来了.
修改文件名?那用rename函数就可以了啊.

第三个横杠?最简单的办法就是获取文件名之后用横杠把字符串'-'切割开来,只取前面的部分就可以了,而且要保持文件后缀名不变,那就要先保存好原有的扩展名.

#获取.在文件名中最后一次出现的位置并以其为起点剪切字符串获取后缀名.
$ext = substr($oldName,strripos($item,'.'));
#以-分割原有文件名
$oldNameArr = explode('-',$oldName);
#拼接新的文件名与文件后缀
$newFileName = $oldNameArr[0].'-'.$oldNameArr[1].'-'.$oldNameArr[2].$ext;

那么有了上面这些代码,我们只需要获取目录中的所有文件并循环执行就可以了.

#首先是设置目标目录
$dir = 'D:\pic\testpic';
#再是循环获取目录中的所有文件名
$handler = opendir($dir);
while (($filename = readdir($handler)) !== false) {
    if ($filename != "." && $filename != "..") {
        $files[] = $filename ;
    }
}
#关闭目录
closedir($handler);

#循环修改目标目录中的文件名
foreach ($files as $item)
{
    $ext = substr($item,strripos($item,'.'));
    $oldNameArr = explode('-',$item);
    $newFileName = $oldNameArr[0].'-'.$oldNameArr[1].'-'.$oldNameArr[2].$ext;
    rename($dir.'\\'.$item,$dir.'\\'.$newFileName);
}

首先有几点需要注意的.首先是最终用于改名的rename函数,这函数千万填写绝对路径避免找不到文件.

另外,就是我是在windows中运行这个脚本的,所以路径拼接都是用的,在最终rename时候拼接目录与文件名的时候需要 \这样来写来转义,不然会以为你拼接的是字符串边界符的单引号或者双引号.

如果是linux或者mac就没这问题,因为这两个系统是用的/来做目录的连接符.

所以一定要注意自己是在哪个系统,注意拼接路径和文件名时到底用/还是.

最后修改:2021 年 06 月 01 日
如果想投币,那就打发点儿咯.