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

时间:2011-05-18 15:15:01

标签: linux comparison diff md5 md5sum

我有2个文件。我们称它们为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 个答案:

答案 0 :(得分:15)

简易启动:

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

另外,请考虑

diff -EwburqN folder1/ folder2/

答案 1 :(得分:2)

仅使用diff上的<(cut -c -32 md5sums.sort.XXX)比较md5列,并使用diff告诉--old/new-line-format='%dn'$'\n'仅打印添加或删除的行的行号。将其传递到ed md5sums.sort.XXX,以便它只打印md5sums.sort.XXX文件中的那些行。

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

答案 2 :(得分:1)

如果您要查找重复文件,fdupes可以为您执行此操作:

$ fdupes --recurse

在ubuntu上你可以通过

安装它
$ apt-get install fdupes