PHP脚本删除成千上万的.jpg图像



我的弱共享网络主机不支持cron或perl,我经常需要从某些文件夹中删除数千张。jpg图像。这些图片是从网络摄像头上传的。我想知道是否有一个简单的应用程序可以递归地找到所有。jpg图像并删除它们。

我需要能够仅针对以下日期格式的图像:2011-10-19_00-29-06.jpg…只有超过48小时的图片。

Apache 2.2.20

DirectAdmin 1.39.2MySQL 5.1.57Php 5.2.17

@user427687,你是说所有的图片格式是2011***.jpg吗?如果是这样,可能是我的代码将工作。

<?php
  $path = dirname(__FILE__).'/filepath';
  if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ((time()-filectime($path.'/'.$file)) < 86400*2) {
          if (preg_match('/2011(.*?).jpg$/i', $file)) {
            unlink($path.'/'.$file);
          }
          if (preg_match('/2011(.*?).jpeg$/i', $file)) {
            unlink($path.'/'.$file);
          }
        }
    }
  }
?>

一个简单的原始版本:

$yesterday = date('Y-m-d', strtotime('yesterday')); // 2011-10-17
$day_before = date('Y-m-d', strtotime('2 days ago')); // 2011-10-16
$images = glob('*.jpg');
foreach($images as $img) {
    if (strpos($img, $yesterday) === 0) || (strpos($img, $day_before) === 0)) {
        continue;
    }
    unlink($img);
}

这将删除所有日期戳为3天或更早的文件,通过检查文件的日期戳是昨天还是前天。但它也会删除今天创建的所有文件。

一个更好的版本应该是:

$images = glob("*.jpg");
foreach ($images as $img) {
     $ctime = filectime($img);
     if ($ctime < (time() - 86400 * 2)) {
         unlink($img);
     }
}

此版本检查文件的实际最后修改时间,并删除任何超过48小时的内容。但是,它会更慢,因为由filectime()执行的stat()调用将是一个非廉价调用。

像这样的东西应该让你开始:

class MyRecursiveFilterIterator extends RecursiveFilterIterator {
    const EXT = '.jpg';
    public function accept() {
        // code that checks the extension and the modified date
        return $this->current()->getFilename() ...
    }
}
$dirItr    = new RecursiveDirectoryIterator('/sample/path');
$filterItr = new MyRecursiveFilterIterator($dirItr);
$itr       = new RecursiveIteratorIterator($filterItr, RecursiveIteratorIterator::SELF_FIRST);
// to iterate the list
foreach ($itr as $filePath => $fileInfo) {
    echo $fileInfo->getFilename() . PHP_EOL;
}

或者直接使用php:

<?php
$last_2_days_in_seconds = 3600 * 48;
foreach (glob("*.jpg") as $filename) {
  if((time() - fileatime($filename)) > $last_2_days_in_seconds && preg_match('/^2011/', $filename)) unlink($filename);
}
?>

相关内容

  • 没有找到相关文章

最新更新