Holen Sie sich den Dateinamen nach find -name | xargs

Holen Sie sich den Dateinamen nach find -name | xargs

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 jares 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 jarDateien zipDateien sind und bsdtardies unterstützt wird), um den Abgleich selbst durchzuführen (wodurch Sie eine ausführlichere Ausgabe mit Dateimetadaten erhalten, ohne das Risiko eines grepAbgleichs auf Grundlage dieser Metadaten einzugehen), allerdings benötigen Sie dennoch etwas wie grepzum 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

verwandte Informationen