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

时间:2012-08-10 23:27:45

标签: php delete-file unlink removeall

我有一些目录中包含一些文件:

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

我想删除/test1/124.jpg or /test2/124.jpg以外的所有内容?

我知道目录名称和文件名。有没有办法在使用php和unlink的Linux环境中执行此操作?

5 个答案:

答案 0 :(得分:24)

只需编辑$ 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成为完整路径(没有斜杠)。

答案 1 :(得分:3)

也许有点粗糙,但如果你在Linux系统上,你可以这样做(假设你在正确的目录中):

<?php shell_exec('rm $(ls * | grep -v '.$fileYouWantToKeep.')'); ?>

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

答案 2 :(得分:2)

你可以尝试:

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');
}

答案 3 :(得分:0)

这是另一种选择:

<?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);
}
}
}

?>

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

答案 4 :(得分:0)

你可以将文件移动到临时文件夹,然后删除文件夹,制作一个新的fand移动旧文件夹的文件夹,然后移回fotos,擦除tmp文件夹。 $ profit $