Mar 15

因为整理图标, 所以需要去除重复图片的功能. 通过md5来判断是否重复. 最开始, 我用md5sum工具求md5, 然后再用PHP读取结果去重. 后来一想, 为什么不完全用PHP来做呢? 可以节省大量进程开销. 简单几行代码, 就实现了这个功能.

文件数: 80510, 大小: 452,496,873 字节

只查找不删除的速度:
第一次耗时: 122s
第二次耗时: 44s
第三次耗时: 44s

在查找多次之后, 立即查找并删除的速度:
耗时: 83秒, 删除了54406个文件

<?php
exec("find . -type f", $lines);

$arr = array();
$del = array();

$n = 0;
foreach($lines as $line){
	$line = trim($line);
	if(!$line){
		continue;
	}
	$n ++;
	$md5 = md5_file($line);

	if(isset($arr[$md5])){
		$del[] = $line;
		//echo "$n del $line\n";
		unlink("{$line}");
	}else{
		$arr[$md5] = 1;
	}
}

echo "del " . count($del) . " files\n";
//echo join("\n", $del);

Related posts:

  1. Shell循环
  2. PHP中使用foreach和引用导致程序BUG
  3. Wordpress分页代码
  4. if-else对优化代码冗余度的反作用
  5. 史上最强大的PHP MySQL操作类

Written by ideawu at 2010-03-15 04:09:18 | Views: 3890

6 Responses to “用PHP去除重复图片文件”

  1. 1. Web Log Says:

    只删除图片?

    本机要运行的话要架个PHP运行环境?

  2. 2. ideawu Says:

    是的, 需要PHP运行环境. 另外”find . -type f”是查找目录和子目录下的所有文件, 是Linux环境或者Windows下的cygwin环境使用.

  3. 3. Web Log Says:

    那没戏了。。。
    删错了咋办。。。。

    我有接近3T的东西要整理,里面就有重复的,还有电影。。。。

    想整理整理呢。。没找到合适的方案。。。

  4. 4. ideawu Says:

    1. 怕删错的话, 可以先备份. 或者把unlink改成rename, 移动到别的地方.
    2. 文件太大(文件数量估计在100万没问题), 可能file_get_contents会吃不消(更新, 改成md5_file函数).
    3. 其实不用PHP, 用Python, awk, C#, Java等来做, 应该都差不多一样简单.

    搭建PHP环境非常简单, Windows下解压即用, Linux下apt-get install即可. 倒是获取所有文件的列表要费一些劲.

  5. 5. Web Log Says:

    移动路径??

    搞个LAMP直接搭建?

  6. 6. Web Log Says:

    另外一个问题。。。
    就是03下的IIS+ASPX与LAMP能否共存?

Pages:

Leave a Reply

必须登录, 或者浏览器开启JavaScript支持才可以评论!


网站空间,免费试用