从 bash 中搜索 jar 或 tar

Searching jar or tar from bash

这似乎是一项简单的 bash 任务,但我不知道该怎么做。在此特定实例中,它与 jar 命令有关,但同样适用于 tar 命令。

设置完毕,下面是问题:

我使用以下 bash 命令在 jar 中搜索文件:

jar -tf com.my.jarfile.jar | grep some_search_text

很简单。现在,我有一个 jar 文件目录,我真正想要的是一个命令,它可以告诉我哪些 jar 包含一个名称包含给定字符串的文件。这可能吗?

背景问题:我有一个文件通过我项目中的几个 jar 文件意外扩散。我想确定哪些 jar 文件包含此文件。上面的命令有点不同,因为它将从 jar 中输出与模式匹配的文件。我对知道 jar 中匹配文件的名称不太感兴趣,因为我只是知道哪些 jars 包含匹配项。

假设您对包含文件名与您的 target 字符串相匹配的文件的 jar 文件感兴趣,您可以编写一个简单的循环:

search="some_search_text"
for file in *.jar
do
    echo "$file"
    jar -tf "$file" | grep -e "$search"
done

这将回显每个 jar 文件的名称,然后如果 jar 文件包含名称与搜索字符串匹配的文件,则会显示该文件。 -e 确保即使您的搜索字符串 star 带有破折号也不会混淆。

如果您不希望出现不匹配的名称,则:

search="some_search_text"
for file in *.jar
do
    match=$(jar -tf "$file" | grep -e "$search")
    if [ -n "$match" ]
    then
        echo "$file"
        echo "$match"
    fi
done

如果您只是希望 jar 文件名在包含名称匹配的文件时显示,那么(显然):

search="some_search_text"
for file in *.jar
do
    match=$(jar -tf "$file" | grep -e "$search")
    if [ -n "$match" ]
    then
        echo "$file"
    fi
done

尽管可以缩小为:

search="some_search_text"
for file in *.jar
do
    [ -n "$(jar -tf "$file" | grep -e "$search")" ] && echo "$file"
done

jar 和 tar 命令每次调用都会处理它们的一个文件;没有办法让单个调用处理多个文件。

如果您真的对 jar 文件感兴趣,并且 jar 文件包含与您的搜索文本相匹配的任何内容,那么您可以使用:

search="some_search_text"

grep -e "$search" -l *.jar

-l 按名称列出 jar 文件。即使典型的 jar 文件包含二进制数据,这也能正常工作。