이 명령을 사용하여 *.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 {} +