通过 PHP 递归删除匹配文件

Recursively Delete Matching Files via PHP

我最近修改了我们网站上一些图片的命名规则。当我上传更改名称的图像时,我最终得到了复制的图像,一份使用旧的命名约定,一份使用新的命名约定。图片数以千计,所以我不想手动删除它们。

所以我决定我需要弄清楚一个 php 脚本,它能够从网站上删除旧图像。幸运的是,旧图像的命名始终以 f.jpg 或 s.jpg 结尾。所以我所要做的就是找到所有带有这些结尾的文件并删除它们。我认为这是一件相当简单的事情,但无论出于何种原因,我在网上找到的几种不同的解决方案都无法正常工作。我最终为了不同的目的回到了 posted on Whosebug 的一些旧代码,并为此重新编写了它。我将发布该代码作为我的问题的答案,以防它对其他人有用。

以下是我在选定文件夹及其子文件夹中查找符合特定命名约定的文件并将其删除的解决方案。使其适合您的情况。你会想把它放在你想删除的目录上面,你会通过替换我有 ./media/catalog/ 的部分来指定特定的文件夹。您还需要替换我选择的条件,即 (substr($path, -5)=='f.jpg' || substr($path, -5)=='s.jpg')。请注意,前面代码中的 5 指的是在条件中匹配了多少个字母。如果您只想匹配“.jpg”,您可以将 5 替换为 4。

一如既往,在使用可能影响大量文件的代码时,请务必进行备份,以防代码无法按预期方式工作。

<?php #stick ClearOldJpg.php above the folder you want to delete
function ClearOldJpg(){
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("./media/catalog/"));
    $files = iterator_to_array($iterator, true);

    // iterate over the directory
    foreach ($files as $path) {
              if( is_file( $path ) && (substr($path, -5)=='f.jpg' || substr($path, -5)=='s.jpg')){ 
                unlink($path);
                echo "$path deleted<br/>";              
              }
    }
}

    $start = (float) array_sum(explode(' ',microtime()));
    echo "*************** Deleting Selected Files ***************<br/>";
    ClearOldJpg( );

    $end = (float) array_sum(explode(' ',microtime()));
    echo "<br/>------------------- Deleting selected files COMPLETED in:". sprintf("%.4f", ($end-$start))." seconds ------------------<br/>";
    ?>

这段代码的一个有趣的好处是它会列出被删除的文件并告知 运行.

花费了多长时间。