比较目录之间的公共文件

比较目录之间的公共文件

使用 diff(或类似命令),我想要两个目录之间的差异,但我只想要两个目录中共有的文件的差异。如果文件/目录存在于其中一个目录中而在另一个目录中不存在,则应将其从输出中完全消除。我可以用 diff 本身做到这一点吗?

我更喜欢已经实现的工具,而不是黑客。但请提出任何你能提出的意见。

答案1

就像是:

for file1 in "$directory1"/*
do
    file2="$directory2/$(basename "$file1")"
    [[ -f "$file2") ]] && diff "$file1" "$file2"
done

答案2

这几乎就是diff比较目录时所做的。您的额外要求意味着您不想看到这种情况:

POSIX区域设置中,应使用以下格式报告仅存在于一个目录中的每个文件:

"Only in %s: %s\n", <directory pathname>, <filename>

或许你不想看到这个:

POSIX语言环境中,两个目录共有的子目录可能会用以下格式报告:

"Common subdirectories: %s and %s\n", <directory1 pathname>, <directory2 pathname>

来源

因此将它们过滤掉:

LC_ALL=POSIX diff directory1 directory2 | grep -v '^Only in' | grep -v '^Common subdirectories'

看起来diff使用的其他格式不会与这两种格式相冲突,因此您不会有任何删除想要保留的内容的风险。

笔记:

  • 您可以忽略LC_ALL=POSIX并调整grep模式以适应您的语言环境。本地化格式不应与其他格式冲突,但请检查这种可能性以防万一。
  • 决定你是否想要diff -r

相关内容