find -name 후에 파일 이름 매개변수를 가져옵니다 |

find -name 후에 파일 이름 매개변수를 가져옵니다 |

일부 클래스를 찾고 싶은 여러 개의 항아리가 있는 디렉토리가 있습니다. 다음을 사용하여 클래스가 존재하는지 확인하는 솔루션을 찾았습니다.

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때문에 일치 자체를 사용할 수도 있습니다 (파일 메타데이터를 사용하여 해당 메타데이터 일치 위험 없이 더 자세한 출력을 얻을 수 있음). 파일 이름을 삽입하려면 다음과 같은 것이 여전히 필요합니다 .jarzipbsdtargrepgrep

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

배시 사용:

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

관련 정보