find -name | 之後取得檔案名參數

find -name | 之後取得檔案名參數

我有一個多個 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

一種方法是:

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

相關內容