使用shell脚本比较两个java属性文件

时间:2009-10-28 10:40:49

标签: java unix shell

如何使用shell脚本比较两个不同文件夹中的两个属性文件 输入可以是两个文件夹的路径吗?

两个文件夹中都有多个文件,需要检查每个文件

8 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

你应该考虑使用diff或sdiff。我建议事先对文件进行排序,并删除任何空白行以减少噪音; e.g。

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}

答案 2 :(得分: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

答案 3 :(得分:1)

comm是一个有用的实用程序。它可以告诉你file1中的内容,而不是file2中的内容,file2中的内容,而不是file1中的内容,以及两个文件之间的共同点。它需要先对两个文件进行排序。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

取决于你想要什么。不同的评论有区别吗?空白?订购?我认为最简单的是一个小的时髦脚本。这是一个选择吗?如果不是,请确保在使用diff

之前删除注释abd空格并对输出进行排序

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

答案 6 :(得分:-1)

此Groovy允许您比较两个属性文件。

您可以选择2种差异模式: 1.显示彼此缺少的属性 2.比较这些值以查看异同

https://gist.github.com/aimtiaz11/f786346e0c0d11a5475cfb64e84e9459

答案 7 :(得分:-2)

请参阅另一个PHP代码来区分属性文件on my blog

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