我有一些目录,其中包含一些文件:
/test1/123.jpg
/test1/124.jpg
/test1/125.jpg
/test2/123.jpg
/test2/124.jpg
我想删除除/test1/124.jpg or /test2/124.jpg
?
我知道目录名和文件名。有没有办法在带有 php 的 Linux 环境中做到这一点unlink
?
我有一些目录,其中包含一些文件:
/test1/123.jpg
/test1/124.jpg
/test1/125.jpg
/test2/123.jpg
/test2/124.jpg
我想删除除/test1/124.jpg or /test2/124.jpg
?
我知道目录名和文件名。有没有办法在带有 php 的 Linux 环境中做到这一点unlink
?
只需编辑 $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 成为完整路径(没有尾部斜杠)。
也许有点粗糙,但如果你在 Linux 系统上,你可以这样做(假设你在正确的目录中):
<?php shell_exec('rm $(ls * | grep -v '.$fileYouWantToKeep.')'); ?>
如果包含任何用户输入,您显然需要过滤该变量。
8 年前,我写了这个被接受的快速技巧,但请考虑到
rm
以及mv
删除和移动 shell 命令。shell_exec
也不是微不足道的,因为您没有像exec或system这样的替代方法那样获得退出代码)但是,它具有在单个 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
当文件正在使用或不允许脚本执行用户修改它时,由于权限问题可能无法删除现有文件。
在运行脚本处理不知情的长文件列表之前,请始终使用 ini_get('
max_execution_time');
检查您的脚本执行超时设置(并在必要时考虑使用set_time_limit为您的脚本扩展它)。
这是另一种选择:
<?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);
}
}
}
?>
我现在无法访问我的服务器,所以我没有测试它,但我认为它应该可以工作。先在一些测试目录上尝试一下,看看它是否有效。
您可以将文件移动到临时文件夹,然后删除该文件夹,创建一个新的粉丝移动具有旧文件夹名称的文件夹,然后将照片移回,删除 tmp 文件夹。$利润$