diff 两个目录以进行更改并格式化输出以用于脚本

diff 两个目录以进行更改并格式化输出以用于脚本

我目前尝试监视两个目录和子目录中的文件更改。这些目录包含相同的文件集,其中一些已更改。所以我想我可以使用该diff命令创建包含行号和更改的已更改文件列表。我需要这个列表来通过另一个脚本进一步处理它。

由于您可以使用该diff -r选项递归检查更改,因此我尝试格式化输出以满足我的需要。我无法使用默认的多行输出,但想要具有以下内容:

file_1:

my first line
my second line
my third line

file_2:

my first line
my changed second line
my third line

我想要的输出要么看起来像:

file_2:2:my changed second line

或者(如果更容易的话):

file_1:2:my second line
file_2:2:my changed second line

我设法使用以下参数生成没有文件名的输出:

diff -qbBwr --unchanged-line-format="" --old-line-format=":%d:%L" --new-line-format=":%dn:%L"  file_1 file_2

这导致

:2:my second line
:2:my changed second line

但有两个问题:

  • lfmt 选项不能与递归选项一起使用-r
  • 我没有得到文件名

所以最后的问题是:

有谁知道如何以diff我从上面获得所需输出的方式创建两个目录?

答案1

我认为这应该可以满足您的需要:

diff -r -U0 a/ b/ | awk '/^+++ / {filename=$2; next} /^@@ / {split($3,a,","); line=substr(a[1],2)} /^+/ {text=substr($0,2); print filename ":" line ":" text; line++}'

基本上,它执行普通的递归比较,然后丢弃您不需要的位。 awk 对于这样的事情来说很酷。

diff -U0给出这样的输出:

--- a   2014-07-01 17:05:46.257447351 +0100
+++ b   2014-07-01 17:05:56.157524562 +0100
@@ -2 +2 @@
-my second line
+my changed second line

awk 脚本从该+++行获取文件名、该行的行号@@以及该行的文本+,然后使用所需的冒号打印它们:

file_2:2:my changed second line

编辑:如果一起编辑两行,我注意到一个脚本错误。现在修好了。

相关内容