我目前尝试监视两个目录和子目录中的文件更改。这些目录包含相同的文件集,其中一些已更改。所以我想我可以使用该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
编辑:如果一起编辑两行,我注意到一个脚本错误。现在修好了。