일부 클래스를 찾고 싶은 여러 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
배쉬를 사용하면:
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