find -name | xargs の後にファイル名を取得します。

find -name | xargs の後にファイル名を取得します。

複数の jar ディレクトリがあり、その中にいくつかのクラスを配置したいと考えています。次のコマンドでクラスが存在するかどうかを確認する解決策を見つけました。

find -name "*.jar" | xargs -n 1 jar tf | grep 'myClass'

jar問題は、それがどこにあるのか分からないことです。

ターミナルにファイル名を表示するソリューションを探しています。現在の出力は次のようになります:

[user@server lib]$ find -name "*.jar" | xargs -n 1 jar tf | grep  'RollOn'  
com/ventyx/utils/logutils/rolling/RollOnDemandAppender.class

助言がありますか?

答え1

GNUの場合grep:

find . -type f -name '*.jar' -exec sh -c '
   for file do
     jar tf "$file" | grep -H --label="$file" myClass
   done' sh {} +

または、たとえば 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 {} +

また、bsdtar(jarファイルはzipファイルであり、bsdtarそれをサポートしているため) を使用して、それ自体でマッチングを行うこともできます (これにより、ファイルのメタデータでマッチングするリスクを負うことなく、ファイルのメタデータを含むより詳細な出力を得ることができgrepます)。ただし、ファイル名を挿入するようなものも必要ですgrep

find . -type f -name '*.jar' -exec sh -c '
   for file do
     bsdtar tvf "$file" "*myClass*" | grep -H --label="$file" "^"
   done' sh {} +

答え2

これを行う方法の 1 つ:

find . -type f -name '*.jar' -exec \
    sh -c 'jar tf "$1" | grep -q "$2" && printf -- '%s\n' "$1"' sh {} 'RollOn' \;

答え3

bashの場合:

shopt -s globstar
for file in **/*jar; do
    jar tf "$file" | grep -q 'myClass' && printf '%s\n' "$file"
done

または、ファイル名と一致する行の両方を印刷するには、次のようにします。

shopt -s globstar
for file in **/*jar; do
    jar tf "$file" | awk -vf="$file" '/myClass/{print f":"$0}'
done

関連情報