我最近重新设计了我们网站上一些图像的命名约定。当我上传更改名称的图像时,我最终得到了重复的图像,一份使用旧命名约定,另一份使用新命名约定。这些图像数以千计,所以我不想手动将它们全部删除。
所以我决定需要找出一个能够从网站删除旧图像的 PHP 脚本。幸运的是,旧图像的命名始终以 f.jpg 或 s.jpg 结尾。所以我所要做的就是找到所有具有这些结尾的文件并将其删除。我认为这是一件相当简单的事情,但无论出于何种原因,我在网上找到的几种不同的解决方案都无法正常工作。我最终回到了一些旧代码 posted on Stackoverflow出于不同的目的并为此重新设计了它。我发布该代码作为我的问题的答案,以防它对其他人有用。
最佳答案
下面是我的解决方案,用于在选定的文件夹及其子文件夹中查找与特定命名约定匹配的文件并删除它们。使其适合您的情况。您需要将其放在要删除的目录之上,然后通过替换 ./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/>";
?>
此代码的一个有趣的好处是,它将列出正在删除的文件并告知运行时间。
关于php - 通过PHP递归删除匹配文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31485870/