我正在尝试执行一项检查,其中所有具有相同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
答案 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
删除文件的文件。使用脚本可以根据任意输入自动删除文件,从而轻松拍摄脚本。