gpt4 book ai didi

ubuntu - 通过 cli 删除重复图像

转载 作者:行者123 更新时间:2023-12-04 18:53:35 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com