PHP-скрипт для удаления тысяч изображений .jpg?

Мой слабый общий веб-хост не поддерживает cron или perl, и мне часто приходится удалять тысячи изображений .jpg из определенных папок. Изображения загружаются с веб-камер. Мне интересно, есть ли простое приложение, которое может рекурсивно находить все изображения .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


person Wes    schedule 18.10.2011    source источник
comment
Если у вас есть DirectAdmin, возможно, у вас есть оболочка, поэтому вы можете удалить все свои jpg одной командой find /dirname_where_jpgs_located -iname '\*.jp?eg' -exec rm -rf {} \;   -  person user973254    schedule 18.10.2011
comment
спасибо за быстрый ответ ... хост не разрешает ssh :( Знаете ли вы приложение php с графическим интерфейсом, которое упрощает этот процесс для непрограммиста? Спасибо за любые советы.   -  person Wes    schedule 18.10.2011
comment
Вам дадут кучу советов, так что никакой гуй не нужен :))   -  person user973254    schedule 18.10.2011
comment
возможный дубликат stackoverflow.com/search?q=recursively+delete+files+php   -  person Gordon    schedule 18.10.2011
comment
попробуйте это webdeveloper.com/forum/showthread.php?t=164845   -  person echo_Me    schedule 18.10.2011


Ответы (4)


@ 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);
          }
        }
    }
  }
?>
person Giberno    schedule 18.10.2011

Простая наивная версия:

$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 часов. Однако это будет медленнее, поскольку вызов stat(), выполняемый функцией filectime(), будет недешевым вызовом.

person Marc B    schedule 18.10.2011
comment
Марк, спасибо за быстрый ответ... А если я хочу настроить таргетинг только на изображения .jpg с текстом 2011 в имени файла? пример: 2011-10-18_16-07-48.jpg Еще раз спасибо - person Wes; 18.10.2011

Что-то вроде этого должно помочь вам начать:

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;
}
person JRL    schedule 18.10.2011

или просто с 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);
}
?>
person user973254    schedule 18.10.2011
comment
время не самое лучшее. теоретически все эти изображения могли быть просмотрены за последние 10 минут, и в этом случае НИ ОДИН не будет удален. - person Marc B; 18.10.2011
comment
вы хотите сказать, что время доступа к файлу не изменится? как это может быть? можете привести пример? Мне это интересно. - person user973254; 18.10.2011
comment
atime — это последний раз, когда кто-то обращался к файлу или изменял его метаданные. простое открытие/просмотр jpg в средстве просмотра изображений обновит его время, так как к нему обращались. ctime и mtime более надежны, так как они меняются только в том случае, если кто-то в файле изменился (ctime, для inode-data) или изменилось содержимое файла (mtime). - person Marc B; 18.10.2011
comment
Спасибо за быстрый ответ.... А если я хочу ориентироваться только на изображения .jpg, которые имеют текст 2011 в имени файла? пример: 2011-10-18_16-07-48.jpg Еще раз спасибо - person Wes; 18.10.2011
comment
но совсем не проблема изменить fileatime на filemtime или использовать (stat)[php.net/stat]проверить все что хочешь, я думаю автор именно так и хотел выполнить свою задачу - person user973254; 18.10.2011
comment
Я улучшил свой первый ответ, чтобы он подходил для вашей задачи с именами файлов. - person user973254; 18.10.2011
comment
Большое спасибо!.... Я попытался создать и загрузить php-файл и дал ему 777 разрешений... это дает мне эту ошибку, когда я посещаю URL-адрес php-файла в браузере: Предупреждение: unlink (2011-10-16_02 -06-58.jpg) [function.unlink]: Доступ запрещен в /home/xxxx/domains/xxxx.com/public_html/xxx/xxx/test.php в строке 6 Спасибо за любые предложения. - person Wes; 18.10.2011
comment
у вас просто нет разрешений, проверьте, как был создан этот файл и т. д. возможно, у вашего локального пользователя есть эти привилегии, но у www нет.. - person user973254; 18.10.2011