schnellster Weg, eine JAR-Datei nach einem bestimmten Namen darin zu durchsuchen?

schnellster Weg, eine JAR-Datei nach einem bestimmten Namen darin zu durchsuchen?

Ich versuche, alle Jars zu finden, die „ springin ihrem Namen“ enthalten. Ich arbeite mit Windows und verwende Cygwin, um die Linux-Befehle auszuführen. Sieht mein folgender Befehl richtig aus?

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

Aus irgendeinem Grund wird es immer 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 greppen?

Nachfolgend sind beispielsweise die gültigen JAR-Dateien aufgeführt, die Spring enthalten:

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

Antwort1

Ich glaube nicht, dass der jarBefehl mehrere .jarDateien als Argumente akzeptiert, daher kommt meines Wissens ein einzelner jarAufruf, der alle Dateien anspricht, .jarnicht in Frage. Eine Möglichkeit, die Dinge zu beschleunigen, indem man einen findExec-Aufruf für jede .jarDatei vermeidet, ist die folgende

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

Antwort2

Der folgende Befehl sucht nach den JAR-Dateien, die eine Teilzeichenfolge springenthalten.

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

Nun durchsucht Ihr ursprünglicher Befehl den Inhalt, der nicht dem entspricht, was der umgebende Text oder die Beispiele sagen.

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

Finden Sie bitteDasChat-Beschreibung, in der Gilles erklärt, 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, spring.txtwird die Datei nicht zurückgegeben. Ich glaube, dass sie das ist, wonach Sie suchen.

Um nun zu verstehen, was Ihr Befehl bewirkt,

  1. Zuerst habe ich eine Java-Datei mit dem Namen erstellt springtest.
  2. Jetzt erstelle ich die classDatei, indem ich den javaBefehl auf der javaDatei ausführe.
  3. Jetzt füge ich es der JAR-Datei hinzu, indem ich den JAR-Befehl ausführe.
  4. Wenn ich jetzt Ihren Befehl ausführe, wird mir die classDatei zurückgegeben und nicht die JAR-Datei, nach der Sie suchen.

     [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
    

verwandte Informationen