2011-07-07 24 views
11

Mục tiêu: liệt kê các tệp trong tất cả các lọ.xargs jar tvf - không hoạt động

này hoạt động:

for f in `find . -name "*.jar"`; do jar tvf $f; done 

này hoạt động quá:

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

này không (nó không in bất kỳ đầu ra):

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

Tại sao sau này không hoạt động ?

Trả lời

14

Liệu việc này

find . -name "*.jar"|xargs -n 1 jar -tvf 
+0

Vâng, cảm ơn bạn. – Synesso

7

Vấn đề là jar tvf chỉ cho phép một tập tin được thông qua trong.

Vòng lặp for chạy các tập tin từng người một

jar tvf 1.jar; jar tvf 2.jar; ... 

Tuy nhiên, xargs cố gắng vừa với nhiều đối số trên một dòng nhất có thể. Do đó nó cố gắng sau:

jar tvf 1.jar 2.jar ... 

Bạn có thể xác minh điều này bằng cách đặt một tiếng vang trong lệnh của bạn:

for f in `find . -name "*.jar"`; do echo jar tvf $f; done 
find . -name "*.jar" | xargs echo jar tvf 

Các giải pháp thích hợp là nói xargs để chỉ sử dụng một tham số cho mỗi lệnh:

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

hoặc

find . -name "*.jar" | xargs -i jar tvf {} # Find style parameter placement 
+0

Cảm ơn bạn đã giải thích. – Synesso

+0

Cảm ơn gợi ý '-i', hay. – sarnold

+0

@ sarnold bạn phải biết rằng đối số này ('-i') không được chấp nhận. xem man xargs ('xargs (GNU findutils) 4.4.2'):' Tùy chọn này không được chấp nhận; sử dụng -I thay thế.' Không có vấn đề gì khi sử dụng nó trong chế độ tương tác nhưng tôi sẽ tránh nó trong các kịch bản vì nó có thể biến mất trong một phiên bản tương lai của xargs. – Lynch

6

Nó không hoạt động vì xargs chỉ gọi một tiến trình với tất cả các đối số.

Có một cách để gọi quy trình mới cho mỗi đối số bằng cách sử dụng -I'{}'.

Hãy thử này để hiểu:

$ seq 10 | xargs echo 
1 2 3 4 5 6 7 8 9 10 
$ seq 10 | xargs -I'{}' echo {} 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
Các vấn đề liên quan