Ich habe ein Verzeichnis mit mehreren JAR-Dateien, in dem ich einige Klassen finden möchte. Ich habe eine Lösung gefunden, um mit dem folgenden Befehl festzustellen, ob eine Klasse vorhanden ist:
find -name "*.jar" | xargs -n 1 jar tf | grep 'myClass'
Das Problem ist, dass ich nicht sehen kann, wo jar
es sich befindet.
Ich suche nach einer Lösung, um den Dateinamen in meinem Terminal anzuzeigen. Meine aktuelle Ausgabe sieht so aus:
[user@server lib]$ find -name "*.jar" | xargs -n 1 jar tf | grep 'RollOn'
com/ventyx/utils/logutils/rolling/RollOnDemandAppender.class
Irgendwelche Vorschläge?
Antwort1
Mit GNU grep
:
find . -type f -name '*.jar' -exec sh -c '
for file do
jar tf "$file" | grep -H --label="$file" myClass
done' sh {} +
Oder verwenden Sie beispielsweise awk:
find . -type f -name '*.jar' -exec sh -c '
export FILE
for FILE do
jar tf "$FILE" | awk '\''/myClass/ {
print ENVIRON["FILE"] ": " $0}'\''
done' sh {} +
Sie können auch verwenden bsdtar
(da jar
Dateien zip
Dateien sind und bsdtar
dies unterstützt wird), um den Abgleich selbst durchzuführen (wodurch Sie eine ausführlichere Ausgabe mit Dateimetadaten erhalten, ohne das Risiko eines grep
Abgleichs auf Grundlage dieser Metadaten einzugehen), allerdings benötigen Sie dennoch etwas wie grep
zum Einfügen des Dateinamens:
find . -type f -name '*.jar' -exec sh -c '
for file do
bsdtar tvf "$file" "*myClass*" | grep -H --label="$file" "^"
done' sh {} +
Antwort2
Eine Möglichkeit, dies zu tun:
find . -type f -name '*.jar' -exec \
sh -c 'jar tf "$1" | grep -q "$2" && printf -- '%s\n' "$1"' sh {} 'RollOn' \;
Antwort3
Mit Bash:
shopt -s globstar
for file in **/*jar; do
jar tf "$file" | grep -q 'myClass' && printf '%s\n' "$file"
done
Oder um sowohl den Dateinamen als auch die passende Zeile auszudrucken:
shopt -s globstar
for file in **/*jar; do
jar tf "$file" | awk -vf="$file" '/myClass/{print f":"$0}'
done