我有一个包含重复文件md5sum
(md5
在 Mac 上)的文件夹,并且我想要一个计划任务计划删除任何发现的作业。
但是,我一直不知道如何做到这一点。到目前为止我所拥有的:
md5 -r * | sort
输出如下:
04c5d52b7acdfbecd5f3bdd8a39bf8fb gordondam_en-au11915031300_1366x768.jpg
1e88c6899920d2c192897c886e764fc2 fortbourtange_zh-cn9788197909_1366x768.jpg
266ea304b15bf4a5650f95cf385b16de nebraskasupercell_fr-fr11286079811_1366x768.jpg
324735b755c40d332213899fa545c463 grossescheidegg_en-us10868142387_1366x768.jpg
3993028fcea692328e097de50b26f540 Soyuz Spacecraft Rolled Out For Launch of One Year Crew.png
677bcd6006a305f4601bfb27699403b0 lechaustria_zh-cn7190263094_1366x768.jpg
80d03451b88ec29bff7d48f292a25ce6 ontariosunrise_en-ca10284703762_1366x768.jpg
b6d9d24531bc62d2a26244d24624c4b1 manateeday_row10617199289_1366x768.jpg
ca1486dbdb31ef6af83e5a40809ec561 Grueling Coursework.jpg
cdf26393577ac2a61b6ce85d22daed24 Star trails over Mauna Kea.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x768.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x7682.jpg
如何根据文件的MD5进行处理以删除重复项?我真的不在乎哪个“原件”我保留 - 但我只想保留一个。
我应该以不同的方式处理这个问题吗?
答案1
我正在 Linux 上工作,这意味着该命令md5sum
输出:
> md5sum *
d41d8cd98f00b204e9800998ecf8427e file_1
d41d8cd98f00b204e9800998ecf8427e file_10
d41d8cd98f00b204e9800998ecf8427e file_2
d41d8cd98f00b204e9800998ecf8427e file_3
d41d8cd98f00b204e9800998ecf8427e file_4
d41d8cd98f00b204e9800998ecf8427e file_5
d41d8cd98f00b204e9800998ecf8427e file_6
d41d8cd98f00b204e9800998ecf8427e file_7
d41d8cd98f00b204e9800998ecf8427e file_8
d41d8cd98f00b204e9800998ecf8427e file_9
b026324c6904b2a9cb4b88d6d61c81d1 other_file_1
31d30eea8d0968d6458e0ad0027c9f80 other_file_10
26ab0db90d72e28ad0ba1e22ee510510 other_file_2
6d7fce9fee471194aa8b5b6e47267f03 other_file_3
48a24b70a0b376535542b996af517398 other_file_4
1dcca23355272056f04fe8bf20edfce0 other_file_5
9ae0ea9e3c9c6e1b9b6252c8395efdc1 other_file_6
84bc3da1b3e33a18e8d5e1bdd7a18d7a other_file_7
c30f7472766d25af1dc80b3ffc9a58c7 other_file_8
7c5aba41f53293b712fd86d08ed5b36e other_file_9
现在使用awk
命令xargs
是:
md5sum * | \
sort | \
awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | \
xargs rm
该awk
部分lasthash
使用空字符串进行初始化,该字符串不会匹配任何哈希,然后检查每一行中的哈希是否lasthash
与当前文件(第二列)的哈希(第一列)相同。如果是,则将其打印出来。在每个步骤结束时,它将设置lasthash
为当前文件的哈希值(您可以将其限制为仅在哈希值不同时才设置,但这应该是一件小事,特别是如果您没有很多匹配文件)。 awk 吐出的文件名被输入到rm
with xargs
,它基本上调用rm
该部分给我们的内容awk
。
您可能需要先过滤目录md5sum *
。
编辑:
使用 Marcins 方法,您还可以使用以下方法:
comm -1 -2 \
<(ls) | \
<(md5sum * | \
sort -k1 | \
uniq -w 32 | \
awk '{print $2}' | \
sort) \
xargs rm
ls
这从由 获得的每个唯一哈希的第一个文件名获得的文件列表中减去md5sum * | sort -k1 | uniq -w 32 | awk '{print $2}'
。
答案2
您可以使用以下命令识别重复文件:
md5sum * | sort -k1 | uniq -w 32 -d
答案3
我跑过复制品作为这个类似问题的答案:https://superuser.com/questions/386199/how-to-remove-duplicate-files-in-a-directory
我在 Ubuntu 上可以apt-get install fdupes
。您肯定会想阅读手册页。就我而言,我能够得到所需的结果,如下所示:
fdupes -qdN -r /ops/backup/
其中表示“递归地查看 /ops/backup 并查找所有重复文件:保留任何给定文件的第一个副本,并悄悄删除其余文件。”这使得保留不频繁写入数据库的多个转储变得非常容易。
答案4
如果你很赶时间(或者你有很多文件)并且想要避免排序的开销(这需要时间),但不介意哈希表的内存开销(或者你有足够的内存和你的很多文件)文件数),
find . -type f -print0 | xargs -0 md5sum | awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }' | xargs -0 rm
find . -type f -print0
:查找所有文件并输出以空结尾的名称
xargs -0 md5sum
:并行计算哈希(根据需要调整-n
max-args 和max-procs,请参阅)-P
man xargs
awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }'
:如果 awk 哈希表中有一个条目包含我们当前正在查看的 md5sum,则打印出我们当前正在查看的文件名,以 null 结尾。否则,将文件名添加到哈希表中。
xargs -0 rm
:获取通过管道输入的空终止字符串并将它们发送到 rm。
这比 fdupes 快得多。
如果您的文件名包含换行符,awk 可能会在换行符处截断它,因为 md5sum 也用换行符分隔记录。
这是基于https://stackoverflow.com/questions/11532157/remove-duplicate-lines-without-sorting和https://stackoverflow.com/questions/9133315/how-can-i-output-null-termerated-strings-in-awk