确定两个目录是否有任何差异的有效方法?

确定两个目录是否有任何差异的有效方法?

我想递归比较两个预期相同的目录树,但我不想进行长时间的完整比较。我想进行有效的比较,这样一旦检测到 1 个差异,命令就会停止并返回,并告诉我哪个文件不同。

我认为不同之处在于:

  • 两个文件有不同的内容(不同的时间戳并不重要)
  • 在一个目录中找到了一个文件,但在另一个目录中没有找到(当然,在完全相同的路径上)

笔记:

  • 我不需要知道文件内的实际差异,只需文件路径就足够了
  • 我在 Ubuntu 20.04 上尝试了 diff 3.7,它没有我能看到的“在差异时停止”选项
  • 这些文件是文本和二进制的混合

答案1

我不知道有哪个程序可以做到这一点,但编写一个小脚本很容易,diff只需在第一个差异处调用并停止即可。就像这样:

#!/bin/bash

dir1="$1"
dir2="$2"

if [[ "*$dir1*$dir2*" == *"**"* ]]; then
    echo "Use: $0 dir1 dir2"
    exit 6
fi

while read line; do
    echo "The directory contents are different."
    exit 1
done < <(diff -qr "$dir1" "$dir2")
echo "The directory contents are the same."

这会将 的输出通过管道传输diff到 中read,一旦收到任何内容,就会退出 shell,并终止diff子进程。

相关内容