我有一个多个 jar 目录,我想在其中找到一些类。我找到了一个解决方案,使用以下命令查看类是否存在:
find -name "*.jar" | xargs -n 1 jar tf | grep 'myClass'
问题是我看不到jar
它位于哪个位置。
我正在寻找一种在终端中显示文件名的解决方案。我当前的输出是这样的:
[user@server lib]$ find -name "*.jar" | xargs -n 1 jar tf | grep 'RollOn'
com/ventyx/utils/logutils/rolling/RollOnDemandAppender.class
有什么建议么?
答案1
使用 GNU grep
:
find . -type f -name '*.jar' -exec sh -c '
for file do
jar tf "$file" | grep -H --label="$file" myClass
done' sh {} +
或者使用 awk 例如:
find . -type f -name '*.jar' -exec sh -c '
export FILE
for FILE do
jar tf "$FILE" | awk '\''/myClass/ {
print ENVIRON["FILE"] ": " $0}'\''
done' sh {} +
您还可以使用bsdtar
(因为jar
文件是zip
文件并bsdtar
支持它们)本身进行匹配(允许您使用文件元数据获得更详细的输出,而无需冒grep
匹配该元数据的风险),尽管您仍然需要类似的东西grep
插入文件名:
find . -type f -name '*.jar' -exec sh -c '
for file do
bsdtar tvf "$file" "*myClass*" | grep -H --label="$file" "^"
done' sh {} +
答案2
一种方法是:
find . -type f -name '*.jar' -exec \
sh -c 'jar tf "$1" | grep -q "$2" && printf -- '%s\n' "$1"' sh {} 'RollOn' \;
答案3
使用bash:
shopt -s globstar
for file in **/*jar; do
jar tf "$file" | grep -q 'myClass' && printf '%s\n' "$file"
done
或者,打印文件名和匹配行:
shopt -s globstar
for file in **/*jar; do
jar tf "$file" | awk -vf="$file" '/myClass/{print f":"$0}'
done