删除c shell中具有相同md5sum的文件

时间:2015-03-12 18:13:11

标签: shell duplicates md5sum

我正在尝试执行一项检查,其中所有具有相同md5sum的文件将在第一次出现时被删除。

输入:第一列是md5值,第二列是文件名。

ab331f253704b84ae0aa5606adce4e7d  1.tcl              
ab331f253704b84ae0aa5606adce4e7d  2.tcl             
d86bbfda16f0d63ba35945e09dddce4d  3.tcl            
1d0b140d16d32d2adbaa15643bdba412  4.tcl            
8c97ae7965ae44ca6a4000d4e5988d54  5.tcl             
ddf373efda3bbdf83d2dfa9cb7fc4d96  6.tcl                  
1d0b140d16d32d2adbaa15643bdba412  7.tcl               
ddf373efda3bbdf83d2dfa9cb7fc4d96  8.tcl

输出:执行rm -rf 2.tcl 7.tcl 8.tcl,因为存在具有相同md5sum的其他文件。

ab331f253704b84ae0aa5606adce4e7d  1.tcl             
d86bbfda16f0d63ba35945e09dddce4d  3.tcl               
1d0b140d16d32d2adbaa15643bdba412  4.tcl                           
8c97ae7965ae44ca6a4000d4e5988d54  5.tcl            
ddf373efda3bbdf83d2dfa9cb7fc4d96  6.tcl

2 个答案:

答案 0 :(得分:0)

你的问题是什么?算法或在csh中实现它?

如果你不是在寻找超快速的操作,那么天真的算法很简单:

用伪语言:

for srcfile in sorted(list_of_files):
  for tgtfile in list_of_files:
    if srcfile != tgtfile and md5(srcfile) == md5(tgtfile):
      delete tgtfile

答案 1 :(得分:0)

我假设您的目标是从文本输入中删除某些行,而不是删除文件。

像这样:

awk '! seen[$1]++'

这是从标准输入读取的。如果输入在文件中,您可以执行以下操作:

awk '! seen[$1]++' inputfile.txt

或者,如果它是某个命令的输出:

some_command | awk '! seen[$1]++'

说明:seen是一个关联数组。 $1是当前行的第一个以空格分隔的字段。 awk逐行处理输入。 seen[$1]告诉您之前是否已看到当前行的第一个字段; ++增加该值,将当前行标记为下次看到时已经看到的行。增加不存在的数组元素将其设置为1

这假设您在系统上安装了awk。你可能会这样做。

如果您正在寻找纯csh中的解决方案,而不需要调用外部命令,那将会更加困难(而且我无法想到这样做的理由)


显然你真的想删除这些文件。以下是解决方案:

awk '{ md5sum = $1; file = $2; if (seen[md5sum]++) { print "rm", file } }'

同样,您需要为此命令提供所需的输入。

这会打印但不执行一系列rm命令。例如,给定问题中的输入,输出为:

rm 2.tcl
rm 7.tcl
rm 8.tcl

您可以修改awk命令以使用system("rm " file")而不是仅打印它,但为了增加安全性,我将输出写入文件,检查它是否正确,然后source删除文件的文件。使用脚本可以根据任意输入自动删除文件,从而轻松拍摄脚本。