schnellster Weg, um JAR-Datei für einen bestimmten Namen darin zu grep?


7

Ich versuche alle Gläser zu finden, die springin seinem Namen stehen. Ich arbeite mit Windows und benutze Cygwin, um die Linux-Befehle auszuführen. Sieht mein unten stehender Befehl richtig aus?

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

Aus irgendeinem Grund wird es noch verarbeitet und das Ergebnis wird nicht auf dem Bildschirm angezeigt. Gibt es eine schnelle Möglichkeit, die JAR-Datei mit einem bestimmten Namen zu durchsuchen?

Im Folgenden finden Sie beispielsweise die gültigen JAR-Dateien, in denen Spring enthalten ist.

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

Sie können ohne grepso versuchen . find /some/dir -type f -name "*spring*.jar"
Ramesh

@Ramesh, OP sucht nach der spring
Glasliste

@ 1_CR, ja, mein Befehl ist also auch, alle jarDateien zu durchsuchen , in denen das Wort enthalten springist.
Ramesh

Ihr Befehl sucht nach einem Dateinamen mit Feder darin, aber er sucht nach den Dateien im Glas.
Strg-Alt-Delor

@richar: nein nur der Glasname, dessen Name Frühling hat.
Arsenal

Antworten:


3

Ich glaube nicht, dass der jarBefehl mehrere .jarDateien als Argumente akzeptiert, so dass ein einziger jarAufruf von AFAIK, der alle .jarDateien adressiert , nicht in Frage kommt. Eine Möglichkeit, die Dinge zu beschleunigen, indem ein findExec-Aufruf für jede .jarDatei vermieden wird, ist die folgende

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

2

Der folgende Befehl sucht nach den JAR-Dateien, die Teilzeichenfolgen enthalten spring.

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

Jetzt durchsucht Ihr ursprünglicher Befehl den Inhalt, was nicht der Text um ihn herum oder die Beispiele sagen.

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

In dieser Chat-Beschreibung erklärt Gilles, warum der obige Befehl nicht das ist, wonach Sie suchen.

Testen

[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

Ausgabe :

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

Wie Sie sehen können, wird die spring.txtDatei nicht zurückgegeben, was meiner Meinung nach das ist, wonach Sie suchen.

Um zu verstehen, was Ihr Befehl tut,

  1. Zuerst habe ich eine Java-Datei erstellt, die den Namen als hat springtest.
  2. Jetzt erstelle ich die classDatei, indem ich den javaBefehl für die javaDatei ausführe.
  3. Jetzt füge ich es der JAR-Datei hinzu, indem ich den Befehl jar ausführe.
  4. Wenn ich jetzt Ihren Befehl ausführe, wird mir die classDatei und nicht die gesuchte JAR-Datei zurückgegeben.

     [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
    
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.