jar에서 클래스 이름 검색

jar에서 클래스 이름 검색

이 명령을 사용하여 *.jar 파일에서 Java 클래스를 검색하고 이러한 클래스가 포함된 jar의 이름만 가져옵니다.

grep -ral --include=*.jar SignonEJB .

출력에서 클래스 이름을 어떻게 얻을 수 있나요?

답변1

파일 이름만 나열됨을 -l나타내려면 이 옵션을 전달합니다 . grep이것은 파일의 이름이며 .jar다른 파일은 관련되지 않습니다.

클래스 이름을 출력 하려면 grep이를 제거해야 합니다 -l. 그러나 jar는 바이너리 파일이고 줄로 구성되지 않기 때문에 동일한 "줄"에 다른 많은 쓰레기가 인쇄됩니다. (GNU grep을 사용하면 -a"binary...match"뿐만 아니라 해당 출력을 얻으려면 전달해야 합니다 .)

GNU grep을 사용하면 전체 클래스 이름을 일치시켜 -o출력에 전달할 수 있습니다.

grep -rao --include='*.jar' '[0-9A-Z_a-z]*SignonEJB[0-9A-Z_a-z]*' .

아니면 이 패키지도 원한다면

grep -rao --include='*.jar' '[$./0-9A-Z_a-z]*SignonEJB[0-9A-Z_a-z]*' .

strings또 다른 접근 방식은 먼저 파일을 실행하여 인쇄 가능한 문자열을 추출하는 것입니다. (두 명령은 동일합니다. sed 버전은 차단 \&하고 랩하는 반면 awk 버전은 모든 문자를 지원합니다.)

find . -name '*.jar' -exec sh -c 'strings "$0" | grep SignonEJB | sed "s&^&$0&"' {} \;
find . -name '*.jar' -exec sh -c 'strings "$0" | jar=$0 awk "/SignonEJB/ {print ENVIRON[\"jar\"] \":\" $0}"' {} \;

또는 ( 엄밀히 말하면 을 사용하면 grep거짓 긍정이 발생할 가능성이 적더라도 더 안정적으로 말하면) unzip파일 이름을 나열하고 필터링하는 것을 사용하십시오.

find . -name '*.jar' -exec sh -c 'unzip -l -- "$0" | grep SignonEJB' {} \;

답변2

어쩌면 (GNU 도구를 사용하여):

grep -ralZ --include='*.jar' SignonEJB . |
  xargs -r0IJ unzip -l J '*SignonEJB*.class'

또는 좀 더 안정적이고 출력을 더 쉽게 읽을 수 있습니다.

find . -name '*.jar' -exec sh -c 'export i; for i do
    zipinfo -1 "$i" | awk '\''/SignonEJB.*\.class$/{
      print ENVIRON["i"] ": " $0}'\''; done' sh {} +

관련 정보