bash 在 exec 中使用两个命令查找 ~ 如何在一组 JAR 中查找特定的 Java class

bash find with two commands in an exec ~ How to find a specific Java class within a set of JARs

我的用例是我想在 JAR 集合中搜索特定 class 文件。更具体地说,我想在一个目录中递归搜索所有 *.jar 文件,然后列出它们的内容,寻找特定的 class 文件。

这就是我目前所拥有的:

find . -name *.jar -type f -exec echo {} \; -exec jar tf {} \;

这将列出递归找到的所有 JAR 文件的内容。我想把 grep within seconed exec 因为我希望第二个 exec 只打印 JAR 的内容 grep 匹配。

如果我只是放一个管道,然后将其全部通过管道传输到 grep,例如:

find . -name *.jar -type f -exec echo {} \; -exec jar tf {} \; | grep $CLASSNAME

然后我丢失了第一个 exec 的输出,它告诉我 class 文件在哪里(JAR 文件的名称很可能与 class 文件名不匹配).

所以,如果有办法让 exec 到 运行 两个命令,例如:

-exec "jar tf {} | grep $CLASSNAME" \;

这样就可以了。在 exec 命令中使用 grep $(...) 是行不通的,因为我需要 find 中的 {} 来代替找到的文件。

这可能吗? (我也愿意接受其他方法,但首选命令行。

我发现很难在 find-exec 内执行多个命令,所以我通常只用 find 获取结果并循环结果。

也许这样的事情会有所帮助?

find . -type f -name *.jar | while read jarfile; do echo $jarfile; jar tf $jarfile; done

我想通了 - 仍在使用 "one" 命令。我要找的东西实际上在问题 How to use pipe within -exec in find 中得到了回答。我要做的是在 exec 中使用 shell 命令。这最终使命令看起来像:

 find . -name *.jar -type f -exec echo {} \; -exec sh -c "jar tf {} | grep --color $CLASSNAME" \;

当命令递归列出所有 JAR 文件时,--color 将有助于突出最终结果。

几点:

  • 这假设我有一个 $CLASSNAME 集合。 class 名称必须像在 JAR 中一样出现,而不是在 Java 包中。所以 com.ibm.json.java.JSONObject 会变成 com/ibm/json/java/JSONObject.class.
  • 这需要一个 JDK - 这是我们获得 jar 命令的地方。 JDK 必须可以在系统路径上访问。如果你有一个 JDK 不在系统路径上,你可以设置一个环境变量,例如 JAR 指向 jar 可执行文件。我是来自 cygwin 的 运行,所以我的 jar 安装在 "Program Files" 目录中。 space 的存在打破了这一点,所以我必须添加这两个命令:

    export JAR=/cygdrive/c/Program\ Files/Java/jdk1.8.0_65/bin/jar
    find . -name *.jar -type f -exec echo {} \; -exec sh -c "\"$JAR\" tf {} | grep --color $CLASSNAME" \;
    

    shell命令中的$JAR必须转义,否则终端不知道如何处理"Program Files"中的space。