15

我有2个文件。让我们称它们为 md5s1.txt 和 md5s2.txt。两者都包含一个输出

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

命令在不同的目录。许多文件被重命名,但内容保持不变。因此,它们应该具有相同的 md5sum。我想生成一个差异

diff md5s1.txt md5s2.txt

但它应该只比较每行的前 32 个字符,即只比较 md5sum,而不是文件名。md5sum 相等的行应该被认为是相等的。输出应该是正常的差异格式。

4

3 回答 3

16

简单的启动器:

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

另外,考虑一下

diff -EwburqN folder1/ folder2/
于 2011-05-18T15:43:42.077 回答
3

diff使用on仅比较 md5 列<(cut -c -32 md5sums.sort.XXX),并告诉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
于 2011-09-18T12:28:59.973 回答
1

如果您正在寻找重复文件 fdupes 可以为您执行此操作:

$ fdupes --recurse

在 ubuntu 上,您可以通过以下方式安装它

$ apt-get install fdupes
于 2011-09-18T14:05:27.337 回答