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。
我的用例是我想在 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。