2010-10-14 33 views
21

Tôi đang cố gắng để chạy các lệnh sau đây sử dụng nhiệm vụ 'exec' trong Ant:Làm cách nào để sử dụng tác vụ Trình thực thi Ant để chạy các lệnh đường ống?

ls -l /foo/bar | wc -l 

Hiện nay, tôi có exec tôi nhìn như thế này:

<exec executable="ls" outputproperty="noOfFiles"> 
    <arg value="-l" /> 
    <arg value="/foo/bar" /> 
    <arg value="|" /> 
    <arg value="wc" /> 
    <arg value="-l" /> 
</exec> 

Các 'ls' lệnh vẻ để được làm việc nhưng nó có một thời gian khó đường ống đầu ra để 'wc'. Bất kỳ đề xuất?

+1

có vẻ như nó có giá trị để chỉ viết một tác vụ kiến ​​đơn giản để thực hiện việc này, thay vì sử dụng exec. – Chii

+2

Đã có một nhiệm vụ như vậy, được gọi là 'resourcecount'. – JesperE

Trả lời

31

Nếu bạn sử dụng sh -c như Aaron gợi ý, bạn có thể vượt qua toàn bộ đường ống như một arg duy nhất, làm một cách hiệu quả:

sh -c "ls -l foo/bar | wc -l" 

Nếu bạn sử dụng args riêng biệt, họ được tiêu thụ bởi sh , không được chuyển qua ls (do đó bạn chỉ thấy thư mục hiện tại).

Lưu ý rằng trên hệ thống của tôi, ls -l bao gồm tổng số cũng như danh sách các tệp được tìm thấy, có nghĩa là số được hiển thị nhiều hơn số tệp. Vì vậy, đề xuất:

<exec executable="sh" outputproperty="noOfFiles"> 
    <arg value="-c" /> 
    <arg value="ls foo/bar | wc -l" /> 
</exec> 
+0

Cảm ơn Martin, điều này giải quyết được vấn đề tôi đang gặp phải. Cảm ơn Aaron quá. –

2

Bạn cần ai đó để nhận ra và xây dựng đường ống. Hãy thử sh:

<exec executable="sh" outputproperty="noOfFiles"> 
    <arg value="-c" /> 
    <arg value="ls" /> 
    <arg value="-l" /> 
    <arg value="/foo/bar" /> 
    <arg value="|" /> 
    <arg value="wc" /> 
    <arg value="-l" /> 
</exec> 
+0

Hi Aaron - Nó gần như hoạt động! Dường như bỏ qua thư mục/foo/bar và chỉ đếm số lượng tệp trong thư mục hiện tại bạn đang ở trên bash. –

+0

Thử '/ bin/ls -1' (một, không phải i hoặc L) và luôn sử dụng đường dẫn tuyệt đối. –

+0

'ls -l/foo/bar | wc -l' tất cả nên là một đối số duy nhất cho/bin/sh. – JesperE

5

Nếu bạn chỉ muốn đếm các tệp trong thư mục, không sử dụng vỏ bên ngoài. Sử dụng tác vụ resourcecount. Nhanh, gọn, di động, và dễ đọc:

<resourcecount property="numfiles"> 
    <fileset dir="."/> 
</resourcecount> 

Và bạn tất nhiên có thể tùy chỉnh fileset để chỉ bao gồm các tập tin cụ thể mà bạn cần.

(Thực tế là có rất ít trường hợp bạn cần tạo ra vỏ bên ngoài. Bộ chuyển đổi I/O tích hợp và chuỗi bộ lọc đầu vào/đầu ra thường có thể thực hiện tương tự theo cách di động, thậm chí đôi khi ít chi tiết.)

+0

Cảm ơn nhận xét JesperE. Tôi sẽ xem xét lại tài khoản và thay thế giải pháp hiện tại của tôi bằng nó. Chúc mừng –

+0

Câu trả lời khác là câu trả lời tôi đang tìm kiếm, nhưng +1 để cung cấp câu trả lời đúng nhất cho câu hỏi gốc. – undefined

Các vấn đề liên quan