1

在 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
4

1 回答 1

0

我发现 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)
于 2013-01-13T14:42:06.420 回答