递归目录-diff接受外部差异

时间:2013-12-17 06:02:36

标签: shell unix diff

考虑在两个分叉的项目中查找已更改内容的任务。

diff -r让我接近:它能够找到每个目标文件夹中缺少的文件,并指出通过展示差异而改变的文件。

我想使用自定义diff实用程序。我想不必在我的diff实用程序中实现递归目录行走逻辑。

所以,我基本上只是想要一个程序执行diff -r所做的事情,但实际上并没有继续运行差异。

这样的事情存在吗?

2 个答案:

答案 0 :(得分:1)

我认为diff -r的输出已经足够结构化,足以让我“聪明”。这是它的要点。

diff -r proj1/src proj2/src | grep 'diff -r' | cut -d ' ' -f 3,4 | xargs -n 2 sift

其中sift是我的小命令行基于字符的diff util,它围绕diff的diff输出运行。

并使用diff (GNU diffutils) 2.8.1

我也愿意接受更优雅的解决方案!

修改:感谢@janos,-q选项让它非常优秀!

最后要提到的是,通过在Mac的命令行中输入opendiff程序(指定所需目录中的相应文件作为目标,这当然已经在Git repo,对吧?)手动合并很好很快。

事实上,当需要人工合并时,设置Git使用的opendiff可能是最佳选择。

只是我仍然没有在同一个代码库中遇到很多合并冲突情况,它主要是在分配repos(并且对包含共享代码的不同项目有单独的repos)时我需要做这种合并手动使我的“主要”项目与战壕中所做的更改保持同步。

答案 1 :(得分:0)

我认为这更优雅:

diff -rq dir1 dir2 | sed -ne 's/^Files \(.*\) and \(.*\) differ$/\1\n\2/p' | xargs -n 2 sift

主要技巧是使用-q标志,它将以简短格式打印差异,例如:

Files dir1/x and dir2/x differ
Only in dir1: path/to/file
Only in dir2: path/to/another

然后你如何解析输出是你的品味问题。

最后,要正确处理文件名中的空格:

diff -rq dir1 dir2 | sed -ne 's/^Files \(.*\) and \(.*\) differ$/sift "\1" "\2"/p' | sh

将它包装在函数中可能是有意义的:

xdiff() {
    diff=$1; shift
    dir1=$1; shift
    dir2=$1; shift
    diff -rq $dir1 $dir2 | sed -ne 's/^Files \(.*\) and \(.*\) differ$/'$diff' "\1" "\2"/p' | sh
}

所以你可以这样称呼它:

xdiff sift dir1 dir2