2013-12-17 67 views
1

考慮找到分叉的兩個項目中發生了變化的任務。遞歸目錄 - 差異接受外部差異

diff -r讓我閉嘴:它能夠找出每個目標文件夾中缺少哪些文件,並指出通過顯示差異而更改的文件。

我想使用自定義比較實用程序。我想不必在我的diff實用程序中實現遞歸目錄行走邏輯。

所以,我基本上只是想要一個程序,做什麼diff -r做的,但其中並沒有實際進行並運行差異。

這樣的事情是否存在?

+0

你的問題不太清楚,但是你在尋找'diff'的'-q'選項嗎? – devnull

+2

@devnull事實證明,喲! –

回答

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 
+1

不錯,現在'差異'的差異不會被浪費。也是一個更好的正則表達式篩網,以減少錯誤肯定的錯誤匹配 –

+0

什麼是'p'標誌sed's //? –

+0

這不是一個標誌,它是一個命令:「打印」。如果進行替換,則會打印該行。由於'sed -ne'中的'-n',所以默認情況下不會打印任何內容。對於與模式不匹配的行,將不會進行替換,並且不會被打印。 – janos

1

我覺得diff -r的輸出已經足夠結構足夠讓我「聰明」了。這是它的要點。

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

其中sift是到處跑,diff的diff的輸出圓我的小基於命令行的字符-DIFF UTIL。

,並使用diff (GNU diffutils) 2.8.1

我打開更優雅的解決方案,以及!

編輯:謝謝@janos,-q選項使它非常優化!

最後要提的一點是,通過在Mac命令行中輸入opendiff程序(指定所需目錄中的相應文件作爲目標,這當然已經在Git倉庫中)對嗎?)做手動合併很好,很快。

事實上,設置opendiff供Git在需要人工合併時使用可能是一條可行的路。

這只是我還沒有遇到過很多合併衝突的情況在同一個代碼倉庫中,它主要是在分叉倉庫(並且爲不同的項目包含共享代碼的單獨倉庫),我需要做這種合併手動將我的「主要」項目與戰壕中所做的更改保持同步。

+1

你問,並回答這個戴帽子,沒有你;-) – janos

+0

哈,不,我做了我典型的「輸出問題,並得出答案」的例程。 –