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이고 이를 지원하기 때문에 자체적으로 일치를 수행하는 데 사용할 수도 있습니다 (해당 메타데이터에 대한 일치 위험을 감수하지 않고 파일 메타데이터로 더 자세한 출력을 얻을 수 있음 ). 하지만 여전히 다음과 같은 것이 필요합니다. 파일 이름을 삽입하려면 다음을 수행하십시오.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

관련 정보