我遇到了一个问题,不知道如何找到最佳解决方案。我有一个如下所示的文件列表:
file1\0file2\0...fileX\0\0file(x+1)\0
每个文件名都用 分隔\0
,每组文件都用额外的 分隔\0
。每个组中的每个文件都有相同的哈希码(我使用 md5sum 来计算它们)。我需要找到每组中的哪些文件是相同的并打印它们。
例如,我有一组 6 个文件(我们称它们为 f1、f2、f3、f4、f5、f6)。我使用 diff 发现 f1,f2,f3 相同,f4,f5 也相同(但与 f1,f2,f3 不同)。所以我想打印文件f1,f2,f3和f4,f5但不是f6(因为我没有找到f6的重复项)。
我用来| while read -r -d $'\0' file
读取数据。你们能帮我找到最佳的方法吗?
编辑:为了简化我的问题。我有一个有 n 个字段的数组。我正在寻找易于在 bash 中实现的算法,而不是最慢的算法,它会找到相同的值,并在这些值的末尾添加一些数字,这将有助于稍后对其进行排序。参考我的示例,在“排序”之后,我想打印“f1 1”、“f2 1”、“f3 1”、“f4 2”、“f5 2”、“f6 3”,然后使用 awk 将其修改为桌子。
答案1
考虑到您必须使用 MD5,并且您的输入文件据说存在哈希冲突(二进制不同文件的 MD5 和相等),您可以采用的一个技巧是在对它们进行哈希处理时使用随机 SALT(短随机字符串),以使冲突的校验和再次变化。
例如
#!/bin/bash
SALT=$(dd if=/dev/urandom status=none bs=1c count=128)
FILES=("f1" "f2" "f3" "f4" "f5");
for file in "${FILES[@]}"
do
echo $(echo $SALT | cat - "$file" | md5sum --binary | cut -d' ' -f1) $file
done
这将为每个文件计算 MD5 哈希值文件,添加随机生成的128字节盐混合,产生如下输出:
741eefc6c14d80ee38164a0961cfd200 f1
741eefc6c14d80ee38164a0961cfd200 f2
741eefc6c14d80ee38164a0961cfd200 f3
68441eb38393a75dee94ae089d528633 f4
68441eb38393a75dee94ae089d528633 f5
如果您再次运行此命令,您将获得不同的校验和(如盐会有所不同),但它们仍然会匹配重复文件:
bc2fdca1b765989b62e507711749c5b4 f1
bc2fdca1b765989b62e507711749c5b4 f2
bc2fdca1b765989b62e507711749c5b4 f3
a31019a6ace1f51b18920bb33d781c97 f4
a31019a6ace1f51b18920bb33d781c97 f5
现在您可以处理这个“MD5SUM 文件”列表,以获取重复项列表。
您还必须调整它以处理您的格式的输入数据 - 多个 \0\0 分隔的组,\0 分隔的文件名。 (不会让你的作业失去所有乐趣)。