收了很多二次元图片,难免会有重复的。 写了个小脚本删除重复的。
#! /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 1
我觉得没必要一上来就对比 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 1
简单问题复杂解,没必要用 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 1
python 确实挺好用的,我之前也是用 Python 整理了我的 ACM 代码,自动抓取网站的题目信息(题号,标题,描述,样例输入,样例输出)等,作为注释放在代码头部,并且把文件名改成题号+标题的格式,最后调用 AStyle 命令行自动格式化代码。
|
28
BlackCat02 2018-07-16 22:27:24 +08:00 2
@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
可以用机器学习筛选出相似的图片啊
|