PHP读取txt文件名列表删除目录非匹配文件的脚本方案
实现方案
你原有代码无法运行是几个低级错误导致的:
- 路径不匹配:你说明txt文件存放在
/home/users/路径下,代码里写的是/home/user/images.txt,少了路径中的s,根本读不到正确的txt文件 - 匹配逻辑错误:
glob返回的是带完整目录路径的文件地址,txt里存的是纯文件名,两者格式不统一,in_array永远匹配不上 - 删除路径重复拼接:
glob拿到的$file已经是完整路径,你删除的时候又拼了一次目录前缀,会指向不存在的路径 - 没有做内容过滤:直接按换行拆分txt内容会残留空行、换行符、空格,导致名单匹配失效
- 没有做类型判断:遍历到子目录的时候也会尝试删除,容易引发报错
下面是可以直接运行的代码:
<?php // 路径配置 请根据实际部署情况核对 $whiteListTxt = '/home/users/images.txt'; $targetImageDir = '/home/user/images/'; // 读取白名单文件,自动过滤空行、每行前后的空白和换行符 $keepFiles = array_filter( file($whiteListTxt, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES), fn($line) => !empty(trim($line)) ); $keepFiles = array_map('trim', $keepFiles); // 只遍历目录下的jpeg格式文件,避免误删其他格式内容 $allStoredFiles = glob($targetImageDir . '*.jpeg'); foreach ($allStoredFiles as $fileFullPath) { // 跳过非文件项 if (!is_file($fileFullPath)) { continue; } // 提取纯文件名做匹配 $currentFileName = basename($fileFullPath); if (!in_array($currentFileName, $keepFiles)) { unlink($fileFullPath); } } ?>
运行前提醒
- 首次执行前,先把代码里的
unlink($fileFullPath);替换成var_dump('待删除文件:' . $currentFileName);,在浏览器/命令行跑一次,确认输出的待删除文件列表符合预期,再换回删除逻辑,避免误删 - 确认PHP运行身份对目标图片目录有删除权限、对txt文件有读取权限,否则会抛出权限错误
- 如果你的图片同时有
.jpg后缀,可以再加一行$allStoredFiles = array_merge($allStoredFiles, glob($targetImageDir . '*.jpg'));兼容两种格式
内容的提问来源于stack exchange,提问作者Zythmo
相关产品推荐
相关产品推荐

