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

9

我有几个目录,里面有一些文件:

/test1/123.jpg
/test1/124.jpg
/test1/125.jpg
/test2/123.jpg
/test2/124.jpg

我想删除除了/test1/124.jpg或/test2/124.jpg之外的所有文件?

我知道目录名和文件名。在Linux环境中,是否有使用php和unlink来完成此操作的方法?

5个回答

37

只需编辑 $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);
    }
}

对于每个目录,您需要运行一次该命令。

另外,请记得使$dir成为完整路径(没有尾部斜杠),如果目标目录不在此脚本所在文件夹中。


如何为根目录服务于域名?比如服务器上的public_html目录和本地主机上的项目文件夹? - coder101
@coder101 只需将 $dir 变量更改为您想要的路径即可。 - HappyTimeGopher

4
也许有点粗糙,但如果你在Linux系统上,可以这样做(假设你在正确的目录下):
<?php shell_exec('rm $(ls * | grep -v '.$fileYouWantToKeep.')'); ?>

显然,如果该变量包含任何用户输入,则需要进行过滤。


1

这里还有另一个选择:

<?php
$dirList = array('/path/to/dir1','/path/to/dir2'); //List of Dirs with files to be deleted. No trailing slash
$saved = array('path/to/file1','path/to/file2'); //List of files to be saved, no leading slash

foreach($dirList as $directory){
$list = scandir($directory);
foreach($list as $file){
if(!is_int(array_seach($directory.'/'.$file,$saved))){ //Array search returns key if needle exists, so we check if it does not return int
unlink($file);
}
}
}

?>

我现在无法访问我的服务器,所以我还没有测试过,但我认为它应该可以工作。首先在一些测试目录上尝试并查看是否有效。


1

8年前,我写了这个快速黑客技巧,得到了接受,但请注意:

  • 它依赖于平台:仅适用于类Unix系统,因为它依赖于Unix路径和rmmv删除和移动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');
    }

无论如何,如果你在这里看一下,在我的回答之后添加了一些基于unlink的解决方案(如下面的评论中所讨论的),这是一个更好的方法,我也建议

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

  • 始终 ini_get('max_execution_time'); 检查您的脚本执行超时设置(如果需要,考虑使用set_time_limit来扩展脚本的执行时间)在运行处理未知长度文件列表的脚本之前。


4
使用肮脏的技巧。如果你只会写 PHP 代码,就不应该使用那个例子。只有当你理解你在做什么以及为什么要这样做时,才能使用它。 - maectpo
@maectpo,你能否给我提供一个更好的答案?我接受任何形式的建设性批评。 - NotGaeL
2
@elcodedocle,下面的答案中有两个示例。来自HappyTimeGopher和Counstantin-Loukas。 他们仅使用PHP,因此您不必知道您的代码在哪个平台上执行,也不必知道shell_exec是否是您的托管/服务器上允许的函数。由于安全原因,它可能已被禁用。 同样,如果您理解为什么要这样做,您就可以这样做。例如,性能问题。 - maectpo
@maectpo 好的,现在我明白你的意思了。除非性能有问题,否则我将使用和推荐unlink和特定语言的调用。谢谢 :) - NotGaeL

0

你可以将文件移动到临时文件夹中,然后删除该文件夹,创建一个新的文件夹并将其命名为旧文件夹的名称,然后将照片移回去,最后删除临时文件夹。$ 获利 $


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接