如何在Bash中比较多个无扩展名的文件

时间:2019-03-05 15:39:13

标签: bash shell unix

我是bash shell脚本的新手。 如何比较无扩展名文件的8个输出(仅二进制值)-相同长度的值,0或1。 为了澄清这些,这是我到目前为止所做的。

for d in */; do
find . -name base -execdir sh -c 'cat {} >> out' \;
done
  

我找到了位于子文件夹中的所有文件,将所有二进制文件读取并连接到out文件中。

现在我有8个要比较的文件(8个父文件夹)。

我已经尝试过“ diff” “ cmp” -但它们都只能使用2个文件。

最后,我需要检查并验证这8个二进制文件之间是否存在差异,并最终导出结果并以HEX格式表示它们-例如:如果out文件中有2个都为'1'= F,如果所有的'0'= 0。因此,最终结果应为: FFFF 0000 (第4个文件均为“ 1”,最后4个文件均为“ 0”)。

这样做的最佳选择是什么? -希望我能弄清楚我的情况。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果您要查找文件列表中唯一的记录

cat $path/$files|uniq -u>/tmp/output.txt
grep -f /tmp/output.txt $path/$files

答案 1 :(得分:0)

让我假设:

  • 我们有8个文件(大概是二进制文件),例如:dir1/out.txtdir2/out.txt,.. dir8/out.txt
  • 我们要在这些文件之间进行比较,并确定哪些文件相同 而哪些不是。

然后执行以下步骤:

  1. 使用以下命令生成文件的哈希值: sha256sum
  2. 比较哈希值并根据哈希值将其分为几类。

我已经创建了8个测试文件,分别是dir1 / out.txt,dir2 / out.txt和dir4 / out.txt   相同,dir3 / out.txt和dir7 / out.txt相同,其他   不同。

然后哈希值将如下所示:

sha256sum dir*/out.txt

298497ad818c3d927498537ed5ab4f9ae663747b6d00ec9a5d0bd9e30a6b714b  dir1/out.txt
298497ad818c3d927498537ed5ab4f9ae663747b6d00ec9a5d0bd9e30a6b714b  dir2/out.txt  
e962879ef251f2117460cf0d5ce714e36a9ab79f2548c48e2121b4e573cf179b  dir3/out.txt  
298497ad818c3d927498537ed5ab4f9ae663747b6d00ec9a5d0bd9e30a6b714b  dir4/out.txt
f45151f5253c62de69c95935f083b5649876fdb661412d4f32065a7b018bf68b  dir5/out.txt  
bdc26931acfb734b142a8d675f205becf27560dc461f501822de13274fe6fc8a  dir6/out.txt  
e962879ef251f2117460cf0d5ce714e36a9ab79f2548c48e2121b4e573cf179b  dir7/out.txt  
11a77c3d96c06974b53d7f40a577e6813739eb5c811b2a86f59038ea90add772  dir8/out.txt  

总结一下结果,让我用 group id 替换哈希值, 相同文件的出现顺序是相同的编号。

这是脚本:

sha256sum dir*/out.txt | awk '{if (!gid[$1]) gid[$1] = ++n; print $2 " " gid[$1]}'

输出:

dir1/out.txt 1
dir2/out.txt 1
dir3/out.txt 2
dir4/out.txt 1
dir5/out.txt 3
dir6/out.txt 4
dir7/out.txt 2
dir8/out.txt 5

第二个字段显示 group id ,以指示哪些文件相同。

请注意,组ID 并不将每个文件的内容表示为: if 2 of the out.txt files are all '1' = F , and if all '0' = 0, 因为我不知道文件的外观。如果OP可以提供 示例文件,可能会对我有所帮助。
顺便说一句,我仍然不确定文件 是普通意义上的二进制文件,因为 OP提到“它只是一个文件,其文件中包含0或1 当我打开它时值。”在我看来,文件由 ASCII“ 0”和“ 1”。我上面的脚本应适用于两个二进制文件 和文本文件。

[更新]

根据OP的信息,以下是针对特定情况的解决方案:

#!/bin/bash

for f in dir*/out.txt; do
    if [[ $(uniq "$f" | wc -l) = 1 ]]; then
        echo -n "$(head -1 "$f" | tr 1 F)" 
    else
        echo -n "-" 
    fi
done
echo

它将每个文件的内容摘要到以下任何一个:全为0的0,全1的F或混合情况的-。(可能是错误)。
例如,如果dir {1..4} /out.txt全为0,dir5 / out.txt为混合型,而dir {6..8} /out.txt全为1,则输出看起来像:

0000-FFF

我希望它将满足OP的要求。