ubuntu - 通过 cli 删除重复图像

标签 ubuntu image-processing duplicate-removal

在 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_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)

关于ubuntu - 通过 cli 删除重复图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14292741/

相关文章:

linux - 如何在 Ubuntu 中启用 CONFIG_RT_GROUP_SCHED 使其成为 RT

image-processing - 图像处理中的归一化

javascript - 删除双 http ://from input using jQuery

java - 从java中的字符串中删除重复值

azure - 配置 Ubuntu ufw 后锁定 Azure VM 实例

Maven 的 Bash 完成转义冒号

升级系统后 PHP 和 Smarty 编译延迟

c - C 中的 Blob 检测(不适用于 OPENCV)

c++ - 在 openCV 中访问 rgbMat 值

vba - Excel VBA : Compiler Errors