使用Shell脚本比较两个Java属性文件

6
如何使用shell脚本比较两个不同文件夹中的两个属性文件?输入可以是两个文件夹的路径。这两个文件夹中都有多个文件,需要检查每个文件。
8个回答

17

你可能需要更详细地解释一下你的要求。但是很可能你可以使用diff命令(结合sort和/或grep)来完成你想要做的事情。

假设你有两个文件:a.properties和b.properties

如果你只想知道这两个文件是否有任何不同,你可以使用

diff a.properties b.properties
如果两者相同,则不会输出任何内容,否则会输出差异列表。如果您需要进行更语义化的比较,即两个属性集是否相同,那么您需要做更多的工作。文件在文本上可能有所不同,但对使用它们的Java程序而言可以表示相同的含义。例如,属性可以按不同的顺序出现。其中可能包含空行、其他空格和注释。如果是这种情况,你是否关心注释是否相同?它们不会影响程序的操作,但对于阅读文件的人来说具有意义(并且有价值)。如果您不关心,请将它们剥离掉。您可能不关心空白行,因为它们没有意义。您还需要处理以下情况:
a.properties:
    prop = value
b.properties:
    prop=value

再次说明,在Java中,它们在文本上是不同的(请注意等号周围的空格),但意思相同。

从简单的开始,假设属性以相同的顺序出现。

忽略空行:

diff -B a.properties b.properties

处理随机空格(例如等号周围的空格)

diff -w a.properties b.properties

将所有内容结合起来:

diff -w -B a.properties b.properties

去除注释:

grep -v '^#.*$' a.properties > a.tmp
grep -v '^#.*$' b.properties > b.tmp
diff -w -B a.tmp b.tmp
rm a.tmp b.tmp

允许属性以不同的顺序出现,去除注释:

grep -v '^#.*$' a.properties | sort > a.tmp
grep -v '^#.*$' b.properties | sort > b.tmp
diff -w -B a.tmp b.tmp
rm a.tmp b.tmp

3
你应该考虑使用diff或sdiff工具。我建议你预先对文件进行排序并删除任何空行,以减少噪音;例如:
file1=/var/tmp/foo.txt
file2=/var/tmp/bar.txt

sort ${file1} | grep -v '^$' > ${file1}.tmp
sort ${file2} | grep -v '^$' > ${file2}.tmp
sdiff ${file1} ${file2}

@Adamski - 关于属性文件中的注释,您怎么看? - Stephen C
这将显示注释之间的差异 - pvgoddijn
@StephenC - 对于你来说,grep -vE "^$|^#" 将会起作用。 - smilyface

3

为了进行语义比较,最好使用PropDiff

Usage: [flags] properties-file1 properties-file2 [-f filenameOrPathPrefixForResults]
   flags:
     -c  property settings that are common to both p1 and p2, where p2 take precedence
     -u  union p1 and p2 where p2 has higher precedence
     -1  properties settings that are only in p1
     -2  properties settings that are only in p2
     -d  intersection of properties in p1 and p2 that have different values
     -e  intersection of properties in p1 and p2 that have equal values

1

comm 是一个非常有用的工具。它可以告诉你文件1中有什么不在文件2中,文件2中有什么不在文件1中,以及两个文件之间的共同点。使用该工具需要先对这两个文件进行排序。

我赞同 @antispams 的 PropDiff 答案,因为它似乎正是你所需要的。


0
尝试使用diff程序,调用“diff /path/to/first/file /path/to/second/file”并cat grep它们。对于diff的特殊用途(如果您需要任何特殊内容),请尝试搜索man diff。

0

这取决于你想要什么。不同的注释有区别吗?空格?顺序?我认为最简单的方法是使用一个小的Groovy脚本。这是一个选项吗?如果不是,请确保在使用diff之前剥离注释和空格并对输出进行排序。

编辑:虽然可以让diff忽略空格,但我不确定这是否符合您的要求,因为空格可能是属性值的一部分。


-1

请添加您链接的相关部分。抱歉,我无法理解您的请求。请提供要翻译的英文文本。 - JJJ
那个链接中的每个部分都是相关的。您需要将Groovy脚本放在属性文件所在的位置,然后运行它。设置步骤以及实际脚本都在那里详细说明了。 - RogerIsDead

-2

查看我的博客另一个PHP代码来比较属性文件:

php list_missing_properties.php "file1.properties" "file2.properties"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接