通过PHP递归删除匹配文件

时间:2015-07-17 22:56:31

标签: php matching delete-file

我最近在网站上重写了一些图片的命名惯例。当我上传带有更改名称的图像时,我最终得到了重复的图像,一个带有旧命名约定的副本和一个带有新命名约定的副本。图像编号为数千,所以我不想手动删除它们。

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

1 个答案:

答案 0 :(得分:2)

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

与往常一样,在处理可能会影响大量文件的代码时,请务必进行备份,以防代码无法正常运行。

<?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/>";
    ?>

此代码的一个有趣的好处是,它会列出要删除的文件,并告诉它运行了多长时间。