只比较每行前n个字符的差异文件

15

我有两个文件,我们称它们为md5s1.txt和md5s2.txt。两个文件都包含一个处理程序的输出结果。

find -type f -print0 | xargs -0 md5sum | sort > md5s.txt

在不同目录下使用命令。许多文件被重命名,但内容保持不变。因此,它们应该具有相同的md5sum。我想生成类似于

diff md5s1.txt md5s2.txt

但它应该仅比较每行的前32个字符,即仅比较md5sum而非文件名。具有相同md5sum的行应被视为相等。输出应以普通的diff格式呈现。

3个回答

17

简单入门:

diff <(cut -d' ' -f1 md5s1.txt)  <(cut -d' ' -f1 md5s2.txt)

此外,考虑只

diff -EwburqN folder1/ folder2/

1
扩展此答案,如果您真的想要n个字符,可以尝试以下命令:diff <(cut -b-80 dump.csv) <(cut -b-80 dump2.csv)(这里,n=80) - Nick T
快速补充一下:延伸上面(6年前)的评论,如果你只想检查md5值,因为它是一个32位的十六进制数,实际的cut命令应该是(以字符为单位)diff <( cut -c-32 f1.txt | sort) <(cut -c-32 f2.txt | sort ),也可以写成cut -b-32或者cut -c1-32等等(但是使用cut -d' ' -f1比较方便,因为你不需要计算字符数)。另外,顺便说一下,所有这些diff选项并不一定总是可用的(例如在macOS上没有-E选项),但是diff本身也无法解决OP的问题。最后再提一下,我实际上是使用fdupes来解决OP最初的问题。 - michael

3
使用diff仅比较md5列,使用<(cut -c -32 md5sums.sort.XXX)命令,并告诉diff仅打印添加或删除行的行号,使用--old/new-line-format='%dn'$'\n'参数。将结果管道传输到ed md5sums.sort.XXX中,以便仅打印来自文件md5sums.sort.XXX的这些行。请保留html标记。
diff \
    --new-line-format='%dn'$'\n' \
    --old-line-format='' \
    --unchanged-line-format='' \
    <(cut -c -32 md5sums.sort.old) \
    <(cut -c -32 md5sums.sort.new) \
    | ed md5sums.sort.new \
    > files-added
diff \
    --new-line-format='' \
    --old-line-format='%dn'$'\n' \
    --unchanged-line-format='' \
    <(cut -c -32 md5sums.sort.old) \
    <(cut -c -32 md5sums.sort.new) \
    | ed md5sums.sort.old \
    > files-removed

ed存在的问题是它将整个文件加载到内存中,如果你有很多校验和,这可能会成为一个问题。不要将diff的输出导入ed,而是将其导入以下命令,这样可以使用更少的内存。

diff … | (
    lnum=0;
    while read lprint; do
        while [ $lnum -lt $lprint ]; do read line <&3; ((lnum++)); done;
        echo $line;
    done
) 3<md5sums.sort.XXX

1
如果您正在寻找重复文件,则 fdupes 可以帮助您实现此功能:
$ fdupes --recurse

在Ubuntu上,您可以通过执行以下操作来安装它

$ apt-get install fdupes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接