jar ファイル内で特定の名前を grep する最も早い方法は何ですか?

jar ファイル内で特定の名前を grep する最も早い方法は何ですか?

spring名前に が含まれるすべての jar ファイルを見つけようとしています。Windows で作業しており、Cygwin を使用して Linux コマンドを実行しています。以下のコマンドは正しいでしょうか?

find . -name "*.jar" -exec jar tf '{}' \| grep -H "spring" \;

何らかの理由で、まだ処理中であり、画面に結果が表示されません。特定の名前の jar ファイルを grep する高速な方法はありますか?

たとえば、以下はspringを含む有効なjarファイルです。

spring-web.jar
spring-core.jar
test-spring.jar 

答え1

jarこのコマンドは.jar引数として複数のファイルを受け付けないと思うので、私の知る限り、1回のjar呼び出しですべてのファイルに対応するのは不可能です。ファイルごとに1回のexec呼び出し.jarを回避することで処理を高速化する1つのオプションは次のとおりです。find.jar

find . -name '*.jar' -exec sh -c \
'for f; do  jar -tf "$f" | grep --label="$f" "spring"; done' sh {} +

答え2

以下のコマンドは、サブ文字列を含む jar ファイルを検索しますspring

find /some/dir -type f -name "*spring*.jar"

ここで、元のコマンドは、周囲のテキストや例に書かれている内容とは異なる内容を調べます。

find . -name "*.jar" -exec jar tf '{}' \| grep -H "spring" \;

見つけてくださいこれチャットの説明では、Gilles が上記のコマンドが探しているものではない理由を説明しています。

テスト

[root@keithpc check]# cd jar_check/
[root@keithpc jar_check]# ls
[root@keithpc jar_check]# touch spring1.jar
[root@keithpc jar_check]# touch 1spring.jar
[root@keithpc jar_check]# touch no_sss_spring.jar
[root@keithpc jar_check]# touch spring.txt

出力:

[root@keithpc jar_check]# find ./ -type f -name "*spring*.jar"
./no_sss_spring.jar
./1spring.jar
./spring1.jar

ご覧のとおり、spring.txtファイルは返されませんが、これがあなたが探しているものであると思います。

さて、コマンドが何をするのか理解するには、

  1. まず、 という名前の Java ファイルを作成しましたspringtest
  2. ここで、ファイルに対してコマンド classを実行してファイルを作成します。javajava
  3. ここで、jar コマンドを実行して jar ファイルに追加します。
  4. classこれで、コマンドを実行すると、探している jar ファイルではなくファイルが返されます。

     [root@keithpc jar_check1]# javac springtest.java
     [root@keithpc jar_check1]# java springtest
     Hello,spring
     [root@keithpc jar_check1]# jar cvf springtest.jar springtest.class
     added manifest
     adding: springtest.class(in = 426) (out= 286)(deflated 32%)
    
     ##Here I run your command after creating the jar file. 
    
     [root@keithpc jar_check1]# find . -name "*.jar" -exec jar tf '{}' \| 
     grep -H "spring" \;
     ##As you can see, it returns me the class file rather than the 
     jar file as the output.  
    
     springtest.class
    

関連情報