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
ファイルは返されませんが、これがあなたが探しているものであると思います。
さて、コマンドが何をするのか理解するには、
- まず、 という名前の Java ファイルを作成しました
springtest
。 - ここで、ファイルに対してコマンド
class
を実行してファイルを作成します。java
java
- ここで、jar コマンドを実行して jar ファイルに追加します。
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