2011-10-18 1 views
0

Мой слабый общий веб-хост не поддерживает cron или perl, и мне часто нужно удалить тысячи изображений .jpg из определенных папок. Изображения загружаются с веб-камер. Мне интересно, есть ли там простое приложение, которое может найти все .jpg изображения рекурсивно и удалить их.PHP-скрипт для удаления тысяч изображений .jpg?

Мне нужно уметь отображать только изображения в следующем формате даты: 2011-10-19_00-29-06.jpg ... и только изображения старше 48 часов.

Apache 2.2.20 DirectAdmin 1.39.2 MySQL 5.1.57 Php 5.2.17

+1

Если у вас есть DirectAdmin, возможно, что у вас есть оболочка, так что вы можете удалить все JPGs с помощью одной команды 'найти/dirname_where_jpgs_located -iname '\ * JP например.? -exec гт -rf {} \; ' – user973254

+0

спасибо за быстрый ответ ... хост не разрешает ssh :( Знаете ли вы о php-приложении с gui, что облегчает этот процесс для не-программиста? Спасибо за любые советы. – Wes

+0

Вам дадут тонну советов, поэтому вам не нужно никаких gui :)) – user973254

ответ

0

или просто с 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); 
} 
?> 
+0

Это ядерное оружие ВСЕХ файлов, а не только старых er-than-48-hour ... –

+0

Извините, я исправил свою ошибку. И мой код выглядит лучше :) – user973254

+1

atime's не самая лучшая вещь. теоретически все эти изображения можно было просмотреть за последние 10 минут, и в этом случае NONE будет удалено. –

0

Простой naiive версия:

$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 дня и старше, путем проверки того, установлен ли файл с отметкой даты вчера или день раньше sterday. Но он также удалит все файлы, созданные сегодня.

Лучше версия будет:

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

Этой версия проверяет фактическое последнее изменение времени на файл, и удаляет все старше 48 часов. Однако он будет медленнее, так как вызов stat(), выполняемый файлом(), будет не дешевым.

+0

Марк, спасибо за быстрый ответ .... И если я хочу только настроить таргетинг .jpg изображений с текстом «2011» в имени файла? Пример: 2011-10-18_16-07-48.jpg Еще раз спасибо – Wes

0

Что-то, как это должно вам начать:

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

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