PHP脚本删除数千个.jpg图像?

发布于 2024-12-11 04:31:00 字数 241 浏览 1 评论 0原文

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

我需要能够仅定位以下日期格式的图像:2011-10-19_00-29-06.jpg ...并且仅定位超过 48 小时的图像。

阿帕奇2.2.20 直接管理 1.39.2 MySQL 5.1.57 PHP 5.2.17

My weak shared web host doesn't support cron or perl and I often need to delete thousands of .jpg images from certain folders. The images are uploaded from webcams. I'm wondering if there is a simple app out there that can find all .jpg images recursively and delete them.

I need to be able to target only images in the following date format : 2011-10-19_00-29-06.jpg ... and only images older than 48 hours.

Apache 2.2.20
DirectAdmin 1.39.2
MySQL 5.1.57
Php 5.2.17

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

后知后觉 2024-12-18 04:31:00

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

@user427687, Do you mean all the picture format 2011***.jpg? if so, may be my code would work.

<?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);
          }
        }
    }
  }
?>
游魂 2024-12-18 04:31:00

一个简单的天真的版本:

$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() 调用将是一个不便宜的调用。

A simple naiive version:

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

This will delete all files which are date-stamped 3 days or older, by checking if the file is date stamped yesterday or day-before-yesterday. But it will also delete all files created today.

A better version would be:

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

This version checks the actual last-modified time on the file, and deletes anything older than 48 hours. It will be slower, however, as the stat() call performed by filectime() will be a non-cheap call.

樱&纷飞 2024-12-18 04:31:00

像这样的事情应该让你开始:

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

Something like this should get you started:

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;
}
少钕鈤記 2024-12-18 04:31:00

或者只是使用 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);
}
?>

or just with 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);
}
?>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文