我需要检查1个jar中的所有文件是否都存在于另一个jar中。我不在乎文件内容是否相同,只是文件名。我可以在vim中打开每个jar并保存那些文件名列表来比较,但是我有很多jar集要比较,所以我想尽可能完全自动化。
答案 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.jar
:diff
,如评论中所示。
然后,您可以以类似的方式将文件列表与sort
进行比较,也可以先使用{{1}}对其进行排序。
答案 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