使用 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
。