如何使用PHP从目录中删除除一个文件以外的所有文件?

Pat*_*cow 3 php unlink delete-file removeall

我有几个目录,其中包含一些文件:

/test1/123.jpg
/test1/124.jpg
/test1/125.jpg
/test2/123.jpg
/test2/124.jpg
Run Code Online (Sandbox Code Playgroud)

我要删除所有除了/test1/124.jpg or /test2/124.jpg

我知道目录名称和文件名.有没有办法在Linux环境中使用php而且可能unlink

Hap*_*her 25

只需编辑$ dir和$ leave_files即可编辑位置和文件.

$dir = 'test1';
$leave_files = array('124.jpg', '123.png');

foreach( glob("$dir/*") as $file ) {
    if( !in_array(basename($file), $leave_files) )
        unlink($file);
}
Run Code Online (Sandbox Code Playgroud)

你会为每个目录运行一次.

还记得如果目标目录与此脚本不在同一文件夹中,则使$ dir成为完整路径(没有斜杠).


Not*_*aeL 1

8 年前,我写了这个快速技巧,已被接受,但请考虑到这一点

  • 它与平台相关:它仅适用于类 UNIX 系统,因为它依赖于类 UNIX 路径以及rm删除mv和移动 shell 命令。
  • 它需要 php 配置来允许通过shell_exec运行系统 shell 命令(除非你知道自己在做什么,否则我不会推荐)
  • 这是对所提出的问题的一个临时答案,甚至不够花哨,无法在文件名数组上使用foreach迭代,从而提供更通用的解决方案。
  • 它不会执行任何类型的错误捕获,因此您的脚本将在失败时默默地继续(捕获错误shell_exec也不是微不足道的,因为您无法像使用execsystem等替代方案那样获得退出代码)

然而,它的优点是可以在单个 shell 命令中运行所有删除操作,并且不需要对每个处理的文件进行额外的排除查找,这使得它在高删除与保留比率下运行得相当快,如果您正在寻找性能的话:

    for ($i=1;$i<=2;$i++){
        shell_exec ('mv /test'.$i.'/124.jpg /test'.$i.'/keep.jpg');
        shell_exec ('rm /test'.$i.'/12*.jpg');
        shell_exec ('mv /test'.$i.'/keep.jpg /test'.$i.'/124.jpg');
    }
Run Code Online (Sandbox Code Playgroud)

无论如何,如果您在这里查看,在我的答案之后添加了一些其他建议基于取消链接的解决方案的答案,这(如下面的评论中所述)是一种更好的方法,我也建议这样做

  • 添加错误处理,因为unlink当文件正在使用或不允许脚本执行用户修改它时,可能会因权限问题而无法删除现有文件。

  • 在运行处理不知不觉的长文件列表的脚本之前,请始终使用 ini_get('max_execution_time');检查脚本执行超时设置(如有必要,请考虑使用set_time_limit为脚本延长超时设置)。

  • 肮脏的黑客。如果您只能编写 PHP 代码,则不应使用该示例。只有当您了解自己在做什么以及为什么这样做时。 (4认同)
  • @elcodedocle,下面的答案中有两个例子。来自 HappyTimeGopher 和康斯坦丁-卢卡斯。他们仅使用 PHP,因此您不必知道您的代码在哪个平台上执行,也不必知道您的主机/服务器上是否允许 shell_exec 运行。由于安全原因,它可能被禁用。再说一次,如果你明白为什么要这样做,你就可以。例如,性能问题。 (2认同)