
本文介绍一个健壮的 PHP 脚本方案,用于读取动态维护的 images.txt 白名单(每行一个文件名),自动清理 /home/user/images/ 目录下所有未出现在白名单中的 JPEG 文件。
本文介绍一个健壮的 php 脚本方案,用于读取动态维护的 `images.txt` 白名单(每行一个文件名),自动清理 `/home/user/images/` 目录下所有**未出现在白名单中**的 jpeg 文件。
在实际运维或自动化图像管理场景中,常需确保某目录(如 /home/user/images/)中的文件严格与配置文件保持一致——即只保留 images.txt 中明确列出的文件,其余一概清理。原始脚本失败的核心原因在于路径处理不一致:glob() 返回的是含完整路径的文件名(如 /home/user/images/15.jpeg),而 images.txt 中仅存基础文件名(如 15.jpeg)。直接用 in_array($file, $array) 比较必然失效。
以下是优化后的完整可执行脚本:
<?php
// 1. 安全读取白名单(自动过滤换行符)
$whitelistFile = '/home/user/images.txt';
if (!file_exists($whitelistFile)) {
die("错误:白名单文件 {$whitelistFile} 不存在。\n");
}
$allowedNames = file($whitelistFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// 2. 定义目标目录并验证可读性
$directory = '/home/user/images/';
if (!is_dir($directory) || !is_readable($directory)) {
die("错误:目录 {$directory} 不存在或不可读。\n");
}
// 3. 获取目录下所有文件(支持 .jpeg/.jpg,避免匹配子目录)
$files = glob($directory . '*.{jpeg,jpg}', GLOB_BRACE);
if ($files === false) {
die("警告:无法读取目录 {$directory} 中的文件。\n");
}
// 4. 遍历并清理非白名单文件
$deletedCount = 0;
foreach ($files as $fullPath) {
$fileName = basename($fullPath); // 提取纯文件名,如 '12.jpeg'
// 注意:使用 strict 模式防止类型混淆(如 '0' == 0)
if (!in_array($fileName, $allowedNames, true)) {
if (unlink($fullPath)) {
echo "已删除:{$fileName}\n";
$deletedCount++;
} else {
echo "警告:无法删除 {$fileName}(权限不足或文件被占用)\n";
}
}
}
echo "清理完成:共删除 {$deletedCount} 个非白名单文件。\n";
?>✅ 关键改进说明:
- 使用 file(..., FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) 替代 explode("\n", ...),更安全地处理 Windows/Linux 换行符及空行;
- basename($fullPath) 精准提取文件名,实现与白名单的语义对齐;
- unlink($fullPath) 直接传入 glob() 返回的完整路径,避免重复拼接导致的路径错误;
- 增加基础错误校验(文件存在性、目录可读性)、扩展名限定({jpeg,jpg})和删除反馈,提升鲁棒性与可观测性;
- 启用 strict 模式(in_array(..., true))防止字符串与数字隐式转换引发误删。
⚠️ 使用前注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 务必先备份重要数据,建议首次运行前将脚本中的 unlink() 替换为 echo "[DRY RUN] 将删除:{$fileName}\n"; 进行模拟验证;
- 确保 PHP 进程对 /home/user/images/ 目录具有 read 和 write 权限(Linux 下常用 chown 或 chmod 调整);
- 若 images.txt 包含路径(如 subdir/1.jpeg),需额外解析逻辑——本方案默认仅匹配同级文件名;
- 可结合 Linux cron 定时执行(如每天凌晨清理):0 2 * * * /usr/bin/php /path/to/clean_images.php >> /var/log/clean_images.log 2>&1。
该脚本简洁、安全、可维护,是实现“白名单驱动文件清理”的典型实践。



















