2011-10-14 36 views
18

Tôi đang tìm kiếm tệp .class bên trong một loạt các lọ.Liệt kê nội dung của nhiều tệp jar

jar tf abc.jar 

công trình cho một tập tin. Tôi đã thử

find -name "*.jar" | xargs jar tf 

không in được gì. Giải pháp duy nhất tôi có thể nghĩ đến, là giải nén tất cả, sau đó tìm kiếm. Có cách nào tốt hơn? Tôi đang ở trên LUnix.

Chỉnh sửa: Khi quét nhiều lọ, bạn nên in tên tệp jar cùng với lớp. Phương pháp này hoạt động tốt: sản lượng

find . | grep jar$ | while read fname; do jar tf $fname | grep SchemaBuilder && echo $fname; done 

Mẫu sản xuất:

1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class 
    1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class 
42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class 
./XmlSchema-1.3.2.jar 
    1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class 
    1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class 
42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class 
./XmlSchema.jar 
+5

Chỉnh sửa của bạn là chính xác những gì tôi đang được tìm kiếm. Cảm ơn – Lucas

Trả lời

31

Bạn cần phải vượt qua -n 1-xargs để buộc nó để chạy một lệnh riêng jar cho mỗi tên tập tin mà nó nhận được từ find:

find -name "*.jar" | xargs -n 1 jar tf 

Nếu không xargs 's dòng lệnh trông giống như jar tf file1.jar file2.jar..., trong đó có một khác nhau có ý nghĩa gì với ý định.

Một kỹ thuật gỡ lỗi hữu ích là để dính echo trước khi lệnh được chạy bởi xargs:

find -name "*.jar" | xargs echo jar tf 

này sẽ in ra lệnh đầy đủ jar thay vì thực hiện nó, vì vậy mà bạn có thể xem những gì xảy ra với nó .

+6

Mẹo tuyệt vời với "echo" – im8bit

+0

cảm ơn. Điều này tiết kiệm rất nhiều thời gian –

+0

bạn có thể vui lòng sửa đổi lệnh find -name "* .jar" | xargs -n 1 jar tf để hiển thị nội dung của tập tin đang được hiển thị? –

-1

Nếu bạn đang sử dụng Eclipse, bạn có thể tạo một dự án và thêm tất cả lọ. Sau đó bạn sẽ có thể tìm thấy một lớp học trong bất kỳ lọ nào.

1

Bạn cũng có thể sử dụng -exec tùy chọn tìm

find . -name "*.jar" -exec jar tf {} \; 
0

Bạn cũng có thể sử dụng giải nén có tốc độ nhanh hơn bình (tùy chọn -l để in nội dung zip).

Ví dụ, một kịch bản nhỏ mà không xấp xỉ những gì bạn muốn:

#!/bin/bash 

for i in $(find . -name "*.jar") 
do 
    if [ -f $i ] 
then 
    echo $i 
    unzip -l $i | grep $* 
fi 
done 
1

Đây là những gì tôi sử dụng trong Cygwin. Nó hỗ trợ tiêu đề phần cho mỗi tệp jar như được yêu cầu ở trên.

find . -name "*.jar" \ 
-exec echo ======\ {}\ ====== \; \ 
-exec /c/Program\ Files/Java/jdk1.7.0_45/bin/jar.exe tf {} \; | less 

Đối với * nix, thả ".exe":

find . -name "*.jar" \ 
-exec echo ======\ {}\ ====== \; \ 
-exec jar tf {} \; | less 
1

tôi phải đối mặt với một tình huống tương tự mà tôi cần phải tìm kiếm một lớp trong một danh sách các tập tin jar hiện diện trong một thư mục. Ngoài ra tôi muốn biết từ đó tập tin jar thuộc về. Tôi đã sử dụng đoạn mã dưới đây (shell script) và phát hiện ra là hữu ích. Kịch bản bên dưới sẽ liệt kê các tệp jar chứa lớp cần tìm kiếm.

#!/bin/sh 
LOOK_FOR="codehaus/xfire/spring" 
for i in `find . -name "*jar"` 
do 
    echo "Looking in $i ..." 
    jar tvf $i | grep $LOOK_FOR > /dev/null 
    if [ $? == 0 ] 
    then 
    echo "==> Found \"$LOOK_FOR\" in $i" 
    fi 
done 

Shell script lấy từ: http://alvinalexander.com/blog/post/java/shell-script-search-search-multiple-jar-files-class-pattern

+0

Hãy cố gắng thêm nhiều ngữ cảnh hơn, không chỉ đăng liên kết vì nó có thể bị lỗi thời trong tương lai. – mjuarez

+0

cảm ơn bạn đã nhập piet.t @ và mjuarez @. Cập nhật câu trả lời của tôi cho phù hợp. cảm thấy tự do để cung cấp đầu vào của bạn. cảm ơn! –

+0

Tự hỏi tại sao nó quá chậm? –

0

Tôi không thấy sự cần thiết cho việc sử dụng exec, điều này đã làm việc cho tôi trong Cygwin trên Windows:

find . -name "*.jar" | while read jarfile; do unzip -l $jarfile | fgrep "foo" ; done 
Các vấn đề liên quan