使用 diff 比较目录

使用 diff 比较目录

我正在尝试比较 AIX 6 上包含二进制文件的两个目录。我diff优先使用dircmp,因为我正在尝试在该服务器和我的 Linux 服务器之间保持一致的输出格式(其中dircmp不可用)。

根据diff man页面显示,

如果指定了 Directory1 和 Directory2 参数,diff 命令将比较两个目录中具有相同名称的文本文件。列出了不同的二进制文件、公共子目录以及仅出现在一个目录中的文件。

然而,二进制文件也被比较,它们的差异输出到标准输出,导致终端屏幕上充满了不可打印的字符,甚至修改了我的窗口的大小(我正在使用pUTTY)。的版本diff没有这个-q选项。有什么方法可以抑制此输出并仅报告文件不同吗?我不想使用rsync -n,因为它需要运行两次,并且 to 和 from 参数相反,才能找到两侧丢失的文件。

相关问题:这里这里

答案1

如果没有条件在不同系统上执行不同的操作,您可以编写多少可移植代码是有限的。dircmp如果可以使用,请不要感到难过,或者GNU 差异如果可供使用的话。

if type dircmp >/dev/null 2>/dev/null; then
  dircmp dir1 dir2
else
  diff -r dir1 dir2
fi

如果您只想知道哪些文件已更改并且不关心列出内容,则可以过滤输出diff以仅保留标题行。 (警告:如果文件名带有换行符,则输出可能无法解析。)

diff -r dir1 dir2 | grep -v '^[<>0-9]'

这样做是grep -v '[^<>]'为了保留有关更改行范围的信息,但仍然过滤掉更改行的内容。

答案2

您可以通过管道传输输出,cat -v以便非打印字符显示为^xM-x,这样至少您的终端不会损坏。如果您知道每个文件差异打印什么类型的标题,您就可以grep只打印它们,例如| grep -E 'Only in|differ'. (我没有找到这些例子的工具)。

相关内容