php 删除当前目录下的所有文件以及文件夹

以下是一个安全的 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
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容