比较2个jar文件中的文件名?

时间:2018-01-25 18:57:13

标签: linux bash jar

我需要检查1个jar中的所有文件是否都存在于另一个jar中。我不在乎文件内容是否相同,只是文件名。我可以在vim中打开每个jar并保存那些文件名列表来比较,但是我有很多jar集要比较,所以我想尽可能完全自动化。

2 个答案:

答案 0 :(得分:1)

jar file围绕ZIP file format构建,通常包含清单文件,它是jar文件中包含的所有文件的列表。此清单(如果存在)将具有名称META-INF/MANIFEST.MF,它将是文本文件。

所以你可以通过从你想要比较的每个jar对中提取清单然后寻找差异来实现你想要的。

如果您有jar命令,则可以使用以下命令提取jar文件的清单:

jar xf jar1.jar META-INF/MANIFEST.MF

如果您有unzip,也可以使用diff执行此操作。

一个简单的脚本可以从两个jar文件中提取清单并使用#!/usr/bin/env bash jar xf "$1" META-INF/MANIFEST.MF mv META-INF/MANIFEST.MF m1.txt jar xf "$2" META-INF/MANIFEST.MF mv META-INF/MANIFEST.MF m2.txt diff m1.txt m2.txt 进行比较,如下所示:

sort

该脚本采用两个参数,即jar文件。如果您希望清单中的文件相同但顺序不同,您可以先尝试使用jar tf jar1.jar 对它们进行排序。这只是脚本的骨架。您可能希望添加文件清理,错误检查等内容。

如果你只关心jar文件中的文件,你可能会得到一个列表:

unzip

您也可以使用unzip -l jar1.jardiff,如评论中所示。

然后,您可以以类似的方式将文件列表与sort进行比较,也可以先使用{{1}}对其进行排序。

还有一个相关的问题:How to read MANIFEST.MF file from JAR using Bash

答案 1 :(得分:0)

“我需要检查一下”......所以你需要脚本退出true / false或者输出第一个而不是第二个jar的文件列表吗?对于后一种情况,这将做:

#!/bin/bash
(jar tf "$1";jar tf "$2";jar tf "$2") | \
    sort | uniq -c | perl -pe's/^\s*([23]\s+.*\n|1\s+)//'

将其存储在files_just_in_first_jar并运行chmod +x files_just_in_first_jar并测试:

./files_just_in_first_jar bundle1.jar bundle2.jar