Ubuntu 通过cli删除重复图像
在linux环境中,我需要通过md5删除文件的重复图像,但在删除之前,我想在文件中写入一些CSV列表 已删除文件->链接的第一个文件 已删除文件->链接文件 等等 问题是我有一个 主文件夹 子文件夹 子文件夹 子文件夹Ubuntu 通过cli删除重复图像,ubuntu,image-processing,duplicate-removal,Ubuntu,Image Processing,Duplicate Removal,在linux环境中,我需要通过md5删除文件的重复图像,但在删除之前,我想在文件中写入一些CSV列表 已删除文件->链接的第一个文件 已删除文件->链接文件 等等 问题是我有一个 主文件夹 子文件夹 子文件夹 子文件夹 图像 超过200.000个文件 所以脚本应该很好,不挂起并且速度很快 你建议往哪个方向走 我手头有ubuntu 更新: 我已经找到了一个脚本,它做了我需要的小修改。它搜索和查找md5副本并删除副本。唯一需要做的最后一步是创建一个包含已删除文件列表->保留的重复文件的文件 #!/b
图像 超过200.000个文件 所以脚本应该很好,不挂起并且速度很快 你建议往哪个方向走 我手头有ubuntu 更新: 我已经找到了一个脚本,它做了我需要的小修改。它搜索和查找md5副本并删除副本。唯一需要做的最后一步是创建一个包含已删除文件列表->保留的重复文件的文件
#!/bin/bash
DIR="/home/gevork/Desktop/webserver/maps.am/all_tiles/dubai_test"
find $DIR -type f -exec md5sum {} \; | sort > /home/gevork/Desktop/webserver/maps.am/all_tiles/dubai_test/sums-sorted.txt
OLDSUM=""
IFS=$'\n'
for i in `cat /home/gevork/Desktop/webserver/maps.am/all_tiles/dubai_test/sums-sorted.txt`; do
NEWSUM=`echo "$i" | sed 's/ .*//'`
NEWFILE=`echo "$i" | sed 's/^[^ ]* *//'`
if [ "$OLDSUM" == "$NEWSUM" ]; then
echo rm "$NEWFILE"
else
OLDSUM="$NEWSUM"
OLDFILE="$NEWFILE"
fi
done
我发现Python是执行这些任务的一个很好的工具,而且更具可移植性(尽管您已经将问题限制在Linux上)。下面的代码将保留副本中最旧的文件(按创建时间),如果这对您来说无关紧要,那么可以简化它。要使用它,请将其另存为,例如,“remove_dups.py”,并作为
python remove_dumps.py startdir
运行。从startdir
,它将查找3层深度的目录,并计算其中内容的md5总和。它存储每个散列的文件名列表。您要查找的文本文件被打印到标准输出,因此您实际上希望将其作为python remove\u dumps.py startdir>myoutputfile.txt
运行。它还将在该输出文件中存储起始目录。对于重复文件,每一行的格式为:md5sum:file1、file2、file3、
。第一个被保留,其他的被移除
import os
import sys
import glob
import hashlib
from collections import defaultdict
BIG_ENOUGH_CTIME = 2**63-1
start_dir = sys.argv[1]
hash_file = defaultdict(list)
level3_files = glob.glob(os.path.join(start_dir, "*", "*", "*", "*"))
for name in level3_files:
try:
md5 = hashlib.md5(open(name).read()).hexdigest()
except Exception, e:
sys.stderr.write("Failed for %s. %s\n" % (name, e))
else:
# If you don't care about keeping the oldest between the duplicates,
# the following files can be simplified.
try:
ctime = os.stat(name).st_ctime
except Exception, e:
sys.stderr.write("%s\n" % e)
hash_file[md5].append((BIG_ENOUGH_CTIME, name))
else:
hash_file[md5].append((ctime, name))
print "base: %s" % (os.path.abspath(start_dir))
for md5, l in hash_file.items():
if len(l) == 1:
continue
# Keep the oldest file between the duplicates.
l = sorted(l)
name = [data[1] for data in l]
# md5sum: list of files. The first in the list is kept, the others are
# removed.
print "%s: %s" % (md5, ','.join('"%s"' % n for n in name))
original = name.pop(0)
for n in name:
print "%s->%s" % (n, original)
sys.stderr.write("Removing %s\n" % n)
try:
os.remove(n)
except Exception, e:
sys.stderr.write("%s\n" % e)
您在
主文件夹
中有图像,也在主文件夹
的子文件夹
中有图像,依此类推?另外,您想确定文件是图像还是知道这些文件夹中的所有文件都是图像?或者您只是想删除重复的文件,不管它们是什么?@mmgp所有文件都位于级别3的end子文件夹中。都是256X256大小的图像。我需要通过md5删除重复项,并编写一个文本文件,其中将显示已删除文件的列表->未删除重复项。它们是否是精确的副本,即即使exif数据未修改?我不认为这是图像处理的原因。但删除文件后,我需要一些带有列表的txt文件,上面写着DELETED_file->ORIGINAL;删除2->原始2;此列表已生成,只是格式不同。您是想让我调整该特定格式的代码,还是说这不能用该代码完成?如果您愿意调整,这对我来说将是一个很大的帮助:)无论如何,我非常感谢您。@MR.GEWA看到更新,这是一个小的调整。如果您只需要此输出,请对其他打印语句进行注释。非常感谢,我们将立即尝试