0

私の脆弱な共有 Web ホストは 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

4

4 に答える 4

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);
          }
        }
    }
  }
?>
于 2011-10-18T17:53:52.873 に答える
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;
}
于 2011-10-18T17:51:52.203 に答える
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);
}
?>
于 2011-10-18T17:49:21.800 に答える
0

シンプルな素朴なバージョン:

$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() 呼び出しは安価ではない呼び出しになるため、遅くなります。

于 2011-10-18T17:50:43.623 に答える