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