我的弱共享网络主机不支持cron或perl,我经常需要从某些文件夹中删除数千张。jpg图像。这些图片是从网络摄像头上传的。我想知道是否有一个简单的应用程序可以递归地找到所有。jpg图像并删除它们。
我需要能够仅针对以下日期格式的图像:2011-10-19_00-29-06.jpg…只有超过48小时的图片。
Apache 2.2.20DirectAdmin 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);
}
?>