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

标签 linux bash jar

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

最佳答案

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

因此,您可以通过从要比较的每个 jar 对中提取 list ,然后寻找差异来实现您想要的。

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

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

如果可用,您也可以使用 unzip 来完成此操作。

从两个 jar 文件中提取 list 并使用 diff 比较它们的简单脚本如下所示:

#!/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

脚本有两个参数,jar 文件。如果您希望 list 中的文件相同但顺序不同,您可以尝试先使用 sort 对它们进行排序。这只是脚本的骨架。您可能想要添加诸如文件清理、错误检查等内容。

如果您只关心 jar 文件中的文件,您可能会得到它们的列表:

jar tf jar1.jar

您也可以为此使用unzip:unzip -l jar1.jar 如评论中所建议。

然后您可以以类似的方式将文件列表与 diff 进行比较,也许首先使用 sort 对它们进行排序。

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

关于linux - 比较 2 个 jar 文件中的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48450030/

相关文章:

linux - 提取 Docker.io 镜像的根文件系统并在 chroot 中使用它是否安全?

bash - 有没有办法引用在 bash 中输入的命令的其他部分,类似于历史扩展

python - 在 fabric 脚本的 psql 命令中转义引号

Java:可运行的 JAR 文件,在不同的计算机上找不到主类

logging - 如何修复JSP编译器警告: one JAR was scanned for TLDs yet contained no TLDs?

java - IntelliJ Maven Selenium 构建 jar

linux - 添加文件时运行 shell 命令

linux - 具有 undefined reference 错误的 udevadm 代码

linux - ImageMagick 将 pdf 转换为图像,转换后的页数

linux - 特定文件夹中的 Git 克隆存储库但保留默认文件夹名称