如何使用bash删除重复文件

war*_*ren 16 bash duplicate shell-script hashsum

我有一个包含重复(由md5summd5在 Mac 上))文件的文件夹,我想安排一个作业来删除任何找到的文件。

但是,我被困在如何做到这一点上。到目前为止我所拥有的:

md5 -r * | sort
Run Code Online (Sandbox Code Playgroud)

输出如下:

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
Run Code Online (Sandbox Code Playgroud)

如何根据文件的 MD5 进行处理以删除重复项?我真的不在乎我保留哪个“原创”——但我只想保留一个。

我应该以不同的方式来解决这个问题吗?

Tri*_*rch 8

我在 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
Run Code Online (Sandbox Code Playgroud)

现在使用awkxargs命令是:

md5sum * | \
sort | \
awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | \
xargs rm
Run Code Online (Sandbox Code Playgroud)

awk部分lasthash用空字符串初始化,它不会匹配任何哈希,然后检查每一行的哈希lasthash是否与当前文件(第二列)的哈希(第一列)相同。如果是,则将其打印出来。在每一步结束时,它将设置lasthash为当前文件的哈希值(您可以将其限制为仅在哈希值不同时才设置,但这应该是一件小事,尤其是当您没有很多匹配的文件时)。awk 吐出的文件名被提供给rmwith xargs,它基本上调用rmawk部件给我们的东西。

您可能需要在md5sum *.

编辑:

使用 Marcins 方法,您也可以使用这个方法:

comm -1 -2 \
  <(ls) | \
  <(md5sum * | \
    sort -k1 | \
    uniq -w 32 | \
    awk '{print $2}' | \
    sort) \
xargs rm
Run Code Online (Sandbox Code Playgroud)

这从由ls选择的每个唯一散列的第一个文件名选择的文件列表中减去md5sum * | sort -k1 | uniq -w 32 | awk '{print $2}'

  • 谢谢:`md5 -r * | 排序 -t ' ' -k 4 -r | awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | xargs rm` 是 OS X 上的调用(根据 @[Stephen Kitt](http://unix.stackexchange.com/a/192709/6388) 的建议,我在最后放了一个 `echo 'will remove '`在用`rm`尝试之前) (2认同)

小智 8

您可以使用以下命令识别重复文件:

md5sum * | sort -k1 | uniq -w 32 -d
Run Code Online (Sandbox Code Playgroud)


小智 6

我遇到了fdupes作为这个类似问题的答案:https : //superuser.com/questions/386199/how-to-remove-duplicated-files-in-a-directory

我能够apt-get install fdupes在 Ubuntu 上。你肯定想阅读手册页。就我而言,我能够获得所需的结果,如下所示:

fdupes -qdN -r /ops/backup/

其中说“递归查看 /ops/backup 并找到所有重复文件:保留任何给定文件的第一个副本,然后悄悄地删除其余文件。” 这使得保存不频繁写入数据库的多个转储变得非常容易。