【问题标题】:Delete files with same md5sum in cshell在 cshell 中删除具有相同 md5sum 的文件
【发布时间】:2015-03-12 18:13:10
【问题描述】:

我正在尝试检查所有具有相同 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

【问题讨论】:

标签: shell duplicates md5sum


【解决方案1】:

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

像这样:

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 文件删除文件。使用基于任意输入自动删除文件的脚本很容易使自己陷入困境。

【讨论】:

  • 谢谢。我可以从 shell 内部访问其他实用程序,但需要删除这些文件。
  • @zerodb:就目前而言,问题看起来就像您只想在给定指定输入文本的情况下生成指定的输出文本(这就是我的回答)。如果你真的想做类似的事情,在这种情况下,rm 1.tcl 7.tcl 8.tcl,请更新你的问题以明确这一点。
【解决方案2】:

你有什么问题?算法还是在 csh 中实现?

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

在伪语言中:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多