내 목표는 현재 디렉토리에 있는 모든 jar, war,ear 파일의 매니페스트에서 jar 항목을 반복적으로 찾는 것입니다.그런 다음 찾은 일치하는 아카이브 이름을 인쇄하십시오.. 아카이브 이름을 인쇄하고 있는데 grep이 일치하는 항목을 출력합니다.
주문하다
find ./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -exec zipgrep -qr "$classpathjarname" '{}' \; -print
효과적이지만 시간이 많이 걸립니다.
다음 명령을 시도했지만 실패했습니다.
find ./ -maxdepth 1 -type f -name "*.*ar" ! -name '*.tar' -print0 | xargs -r0 -P2 zipgrep -rq 'classpath.jar'
오류가 발생합니다
caution: filename not matched: ./abc.jar
caution: filename not matched: ./dsf.jar
/usr/bin/zipgrep: line 97: test: -eq: unary operator expected
/usr/bin/zipgrep: line 100: test: : integer expression expected
답변1
xargs는 더 이상 예전만큼 유용하지 않습니다. find가 수정되어 더 이상 필요하지 않습니다. a 대신 a로 명령줄을 끝내면 -exec
결과 배치 자체에서 find가 호출됩니다. mosvy가 지적했듯이 xargs는 find와 병렬로 실행되지만 이것이 내 처리에 매우 중요하다고 생각하지 않습니다. 그러나 루프에서 압축 파일을 검색하고 있으므로 이 방법이 도움이 될 수 있습니다.+
;
find ./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -exec zipgrep -lr "$classpathjarname" {} +
당신의 대안은 당신이 그것을 이해하지 못하기 때문에 작동하지 않습니다. 첫 번째 버전의 작동 방식은 종료 상태를 통해 일치를 보고하는 zipgrep에 달려 있습니다. 이 변형은 -l 옵션이 수행하는 것과 일치하는 파일 이름을 보고하는 zipgrep에 따라 달라집니다.
find ./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -print0 | xargs -0 -P2 zipgrep -lr "$classpathjarname"
이것이 xargs를 사용하여 수행하는 방법입니다. zipgrep 오류 메시지는 zip 파일이 아닌 파일이 있거나 zipgrep으로 전송되는 빈 zip 파일을 찾고 있기 때문에 발생합니다.
하지만 첫 번째 스크립트에 소요되는 시간의 대부분은 압축된 파일의 내용에 액세스하는 데 시간이 걸리기 때문에 첫 번째 방법보다 훨씬 빠르지는 않습니다.