
收了很多二次元图片,难免会有重复的。 写了个小脚本删除重复的。
#! /bin/env python # -*- coding:utf-8 -*- import sqlite3 import hashlib import os import sys def md5sum(file): md5_hash = hashlib.md5() with open(file,"rb") as f: for byte_block in iter(lambda:f.read(65536),b""): md5_hash.update(byte_block) return md5_hash.hexdigest() def create_hash_table(): if os.path.isfile('filehash.db'): os.unlink('filehash.db') cOnn= sqlite3.connect('filehash.db') c = conn.cursor() c.execute('''CREATE TABLE FILEHASH (ID INTEGER PRIMARY KEY AUTOINCREMENT, FILE TEXT NOT NULL, HASH TEXT NOT NULL);''') conn.commit() c.close() conn.close() def insert_hash_table(file): cOnn= sqlite3.connect('filehash.db') c = conn.cursor() md5 = md5sum(file) c.execute("INSERT INTO FILEHASH (FILE,HASH) VALUES (?,?);",(file,md5)) conn.commit() c.close() conn.close() def scan_files(dir_path): for root,dirs,files in os.walk(dir_path): print('create hash table for {} files ...'.format(root)) for file in files: filename = os.path.join(root,file) insert_hash_table(filename) def del_repeat_file(dir_path): cOnn= sqlite3.connect('filehash.db') c = conn.cursor() for root,dirs,files in os.walk(dir_path): print('scan repeat files {} ...'.format(root)) for file in files: filename = os.path.join(root,file) md5 = md5sum(filename) c.execute('select * from FILEHASH where HASH=?;',(md5,)) total = c.fetchall() removed = 0 if len(total) >= 2: os.unlink(filename) removed += 1 print('{} removed'.format(filename)) c.execute('delete from FILEHASH where HASH=? and FILE=?;',(md5,filename)) conn.commit() conn.close() print('removed total {} files.'.format(removed)) def main(): dir_path = sys.argv[-1] create_hash_table() scan_files(dir_path) del_repeat_file(dir_path) if __name__ == '__main__': main() 
把图片分享后,反馈加载慢。没说的,上webp。
#! /bin/env python # -*- coding:utf-8 -*- import re import os import sys def webp_convert(dir_path): IMAGE_FILE_REGEX = '^.+\.(png|jpg|jpeg|tif|tiff|gif|bmp)$' for root,dirs,files in os.walk(dir_path): print('convert {} files...'.format(root)) for file in files: filename = os.path.join(root,file) if re.match(IMAGE_FILE_REGEX,file,re.IGNORECASE): outfile = filename[:-5] + "a.webp" if file.endswith('.gif'): os.system('gif2webp -lossy ' + filename + ' -o ' + outfile) os.unlink(filename) else: os.system('cwebp ' + filename + ' -o ' + outfile) os.unlink(filename) def main(): dir_path = sys.argv[-1] webp_convert(dir_path) if __name__ == '__main__': main() 1 AX5N 2018-07-16 13:47:08 +08:00 我觉得没必要一上来就对比 md5,可以先对比字节数,字节数相同的再对比 md5 |
2 AX5N 2018-07-16 13:49:14 +08:00 而且如果你收的是二次元的图片的话,那你应该要知道有的图片还分老版和新版的,有可能新版会加了细节,也有可能新版的分辨率会被故意降低。甚至如果你图源不一样的话,md5、分辨率都有可能不一样。比如同一作者在 p 站发的和在 twitter 上发的就有可能不一样。 |
3 swulling 2018-07-16 13:55:49 +08:00 简单问题复杂解,没必要用 sqlite 吧,直接把 hash -> file 关系 存在 Dict 中就完了 另外用 shell 只需要一行 |
4 slime7 2018-07-16 14:29:00 +08:00 先把重复的列出来再提示删除哪个不是更好 |
6 scriptB0y 2018-07-16 18:21:50 +08:00 @cdlixucd 你这个 python rmrepeatfile.py 就是一行 shell |
7 scriptB0y 2018-07-16 18:22:06 +08:00 开玩笑哈哈可以用这个: https://github.com/adrianlopezroche/fdupes |
9 Sanko 2018-07-16 18:28:22 +08:00 via Android |
15 ucun OP |
16 May725 2018-07-16 19:17:47 +08:00 via iPhone ,我需要你的二次元图片试一下 |
17 yuanshuai1995 2018-07-16 19:21:19 +08:00 分享一波图库? |
18 rrfeng 2018-07-16 19:23:19 +08:00 反正都要强行全部算 md5 了…… md5sum * | awk '{if(a[$2])print $1;a[$2]=1}' |xargs rm |
19 swulling 2018-07-16 19:33:39 +08:00 |
21 likuku 2018-07-16 19:44:45 +08:00 via iPhone 前几年因为更换手机 /刷机等等,造成 iPhoto 的图库多有重复,也尝试自己写 py 和 sqlite 来去重,搞了一半,然后就烂尾了… |
22 swulling 2018-07-16 19:50:22 +08:00 via iPhone |
24 swulling 2018-07-16 19:52:35 +08:00 via iPhone 如果用 awk 的 hash 表,更快内存更小,我记得千万记录大约在十来 G,具体得测试下 |
25 lifanxi 2018-07-16 20:41:51 +08:00 via Android 跟我以前写的一个脚本几乎一样。 不过我也建议先看文件大小。然后 md5 不需要算整个文件,头尾各算一点就差不多够了。 |
26 alvin666 2018-07-16 21:56:17 +08:00 via Android 楼上说的对,md5 计算量挺大的,可以先比较文件大小,这我觉得能筛出来 99.99%不同的文件了 |
27 AlisaDestiny 2018-07-16 22:07:02 +08:00 python 确实挺好用的,我之前也是用 Python 整理了我的 ACM 代码,自动抓取网站的题目信息(题号,标题,描述,样例输入,样例输出)等,作为注释放在代码头部,并且把文件名改成题号+标题的格式,最后调用 AStyle 命令行自动格式化代码。 |
28 BlackCat02 2018-07-16 22:27:24 +08:00 @ucun 保险?认真的吗?还是你认为长度不同的文件 md5 可能相同? |
29 Mavious 2018-07-16 22:43:42 +08:00 via iPhone 直接算 md5 会让我 1.8ghz 双核处理器跑崩的。 doublekiller 了解一下。这货算得快,20 分钟就能分析 11g 的琐碎小文件。 |
30 randyzhao 2018-07-16 23:51:50 +08:00 噗 我直接买了个软件 “ Duplicate Photos Fixer Pro ”,可以找相似图片文件,并列出来,删除的过程是手动的。 好用之处在于,不仅仅是 MD5 一样的才被列出来,同一张图片不同分辨率的也会别识别为相似图片。 这样比较方便我删除小尺寸图片,保留大尺寸图片。 不好之处在于,由于是完全按照相似度去识别的。比如公司集体照这种。。。连拍好几张的都会被认定为相似图片。 不过这个也算能解决,筛选时选择 “ Exact Match ” 就可以达到楼主脚本的效果。 |
31 ETiV 2018-07-17 01:42:50 +08:00 shell 一行代码:`sudo rm -fr /` [狗头] |
32 pepesii 2018-07-17 09:04:42 +08:00 via iPhone 干嘛不用 md5 命名,更简单 |
33 littlewing 2018-07-17 13:07:17 +08:00 可以用机器学习筛选出相似的图片啊 |