Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ubuntu 通过cli删除重复图像_Ubuntu_Image Processing_Duplicate Removal - Fatal编程技术网

Ubuntu 通过cli删除重复图像

Ubuntu 通过cli删除重复图像,ubuntu,image-processing,duplicate-removal,Ubuntu,Image Processing,Duplicate Removal,在linux环境中,我需要通过md5删除文件的重复图像,但在删除之前,我想在文件中写入一些CSV列表 已删除文件->链接的第一个文件 已删除文件->链接文件 等等 问题是我有一个 主文件夹 子文件夹 子文件夹 子文件夹 图像 超过200.000个文件 所以脚本应该很好,不挂起并且速度很快 你建议往哪个方向走 我手头有ubuntu 更新: 我已经找到了一个脚本,它做了我需要的小修改。它搜索和查找md5副本并删除副本。唯一需要做的最后一步是创建一个包含已删除文件列表->保留的重复文件的文件 #!/b

在linux环境中,我需要通过md5删除文件的重复图像,但在删除之前,我想在文件中写入一些CSV列表

已删除文件->链接的第一个文件 已删除文件->链接文件

等等

问题是我有一个

主文件夹 子文件夹 子文件夹 子文件夹
图像

超过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看到更新,这是一个小的调整。如果您只需要此输出,请对其他打印语句进行注释。非常感谢,我们将立即尝试