从 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 文件包含二进制数据,这也能正常工作。
这似乎是一项简单的 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 文件包含二进制数据,这也能正常工作。