以下是一个安全的 PHP 脚本,用于扫描并删除当前工作目录下的所有文件和文件夹(不包括脚本自身,除非特别说明)。脚本包含交互确认,避免误操作。
#!/usr/bin/env php
<?php
/**
* 递归删除目录下的所有内容(不包括当前目录本身)
*
* @param string $dir 要清理的目录路径
* @param string|null $excludePath 需要排除的文件/目录的绝对路径(例如当前脚本自身)
* @return bool 是否成功完成(部分失败也会继续,返回 false 表示有错误)
*/
function deleteAll(string $dir, ?string $excludePath = null): bool
{
if (!is_dir($dir)) {
fwrite(STDERR, "错误:{$dir} 不是一个目录\n");
return false;
}
$success = true;
$items = scandir($dir);
if ($items === false) {
fwrite(STDERR, "错误:无法扫描目录 {$dir}\n");
return false;
}
foreach ($items as $item) {
// 跳过当前目录和上级目录的引用
if ($item === '.' || $item === '..') {
continue;
}
$path = $dir . DIRECTORY_SEPARATOR . $item;
// 如果设置了排除路径且当前路径与排除路径相同,则跳过
if ($excludePath !== null && realpath($path) === realpath($excludePath)) {
echo "跳过排除项: {$path}\n";
continue;
}
// 处理符号链接:只删除链接本身,不追踪目标
if (is_link($path)) {
if (unlink($path)) {
echo "已删除符号链接: {$path}\n";
} else {
fwrite(STDERR, "错误:无法删除符号链接 {$path}\n");
$success = false;
}
continue;
}
// 如果是目录,递归删除其内容,然后删除空目录
if (is_dir($path)) {
if (deleteAll($path, $excludePath)) {
if (rmdir($path)) {
echo "已删除目录: {$path}\n";
} else {
fwrite(STDERR, "错误:无法删除目录 {$path}(可能权限不足或非空)\n");
$success = false;
}
} else {
$success = false;
}
} else {
// 普通文件直接删除
if (unlink($path)) {
echo "已删除文件: {$path}\n";
} else {
fwrite(STDERR, "错误:无法删除文件 {$path}\n");
$success = false;
}
}
}
return $success;
}
// 命令行运行检查
if (PHP_SAPI !== 'cli') {
die("此脚本仅允许在命令行(CLI)模式下运行。\n");
}
// 获取当前工作目录(脚本执行时所在的目录)
$currentDir = getcwd();
if ($currentDir === false) {
fwrite(STDERR, "错误:无法获取当前工作目录\n");
exit(1);
}
echo "当前工作目录: {$currentDir}\n";
// 脚本自身的绝对路径
$selfPath = realpath(__FILE__);
$excludeSelf = false;
// 判断脚本自身是否位于当前工作目录下
if ($selfPath !== false && strpos($selfPath, $currentDir . DIRECTORY_SEPARATOR) === 0) {
$excludeSelf = true;
echo "注意:脚本自身位于当前目录,删除时将排除该文件: " . basename($selfPath) . "\n";
} else {
echo "脚本自身不在当前目录,将删除当前目录下的所有内容。\n";
}
// 安全确认提示
echo "\n⚠️ 警告:此操作将永久删除当前目录下的所有文件和文件夹,且不可恢复!\n";
echo "请输入 'yes' 确认执行: ";
$handle = fopen("php://stdin", "r");
$confirm = trim(fgets($handle));
fclose($handle);
if ($confirm !== 'yes') {
echo "操作已取消。\n";
exit(0);
}
echo "\n开始删除...\n";
$result = deleteAll($currentDir, $excludeSelf ? $selfPath : null);
if ($result) {
echo "\n✅ 删除操作完成。\n";
if ($excludeSelf && file_exists($selfPath)) {
echo "注意:脚本自身未被删除,位于 {$selfPath}\n";
echo "如需同时删除脚本自身,请手动执行: unlink('{$selfPath}');\n";
}
} else {
echo "\n❌ 删除过程中出现错误(部分文件/目录可能因权限等原因未被删除)。\n";
exit(1);
}
安全特性
-
仅限 CLI 运行:防止通过 Web 访问意外触发。
-
交互确认:必须输入
yes才会执行删除。 -
自动排除自身:如果脚本位于当前工作目录,删除时会自动跳过,避免运行中异常。
-
符号链接安全:仅删除链接本身,不追踪链接目标,防止误删重要数据。
-
详细日志:每个删除的文件/目录都会输出,错误信息会显示到标准错误。
-
权限处理:遇到无权限删除的文件会报错并继续,不会中断整个流程。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END







暂无评论内容