2011-10-13 26 views
5

Tôi đang tìm cách thực hiện lệnh hiện tại cho mỗi kết quả của tập tin mà không cần xây dựng vòng lặp for. Tôi thấy điều này ở đâu đó nhưng không thể nhớ chính xác ở đâu.Tôi có thể thực hiện lệnh cho mỗi kết quả của tập tin globbing trong zsh mà không có?

(Echo chỉ là một ví dụ, nó cũng sẽ làm việc với psql ví dụ)

Ví dụ:

$ touch aaa bbb ccc ddd 
$ echo "--- " [a-c]* 
--- aaa bbb ccc 

đầu ra mong muốn:

--- aaa 
--- bbb 
--- ccc 

kown cách:

$ for i in [a-c]*; do echo "--- " $i ; done 
--- aaa 
--- bbb 
--- ccc 

Cou ld được thực hiện bằng cách sử dụng cho. Nhưng có lẽ có một cách để làm điều đó ngắn hơn? Có lẽ giống như sử dụng đôi dấu ngoặc nhọn xung quanh glob hoặc bất cứ điều gì?

Cảm ơn. :)

Trả lời

4

Bạn có thể đang tìm kiếm zargs, lệnh có cùng mục đích như xargs nhưng giao diện mới hơn.

autoload -U zargs 
zargs -n 1 -- * -- mycommand 
+0

Cảm ơn, trông "sane" :) –

2

Lệnh printf sẽ ngầm vòng lặp nếu có nhiều tranh cãi hơn placeholders trong chuỗi định dạng:

printf -- "--- %s\n" [a-c]* 

Để thực hiện một lệnh trên mỗi tập tin, bạn cần xargs: Tôi giả sử bạn có GNU xargs có các -0 tùy chọn:

printf "%s\0" [a-c]* | xargs -0 -I FILE echo aa FILE bb 

Thay echo xargs lệnh với bất cứ điều gì bạn cần, bằng cách sử dụng "FILE" giữ chỗ mà bạn cần tên tập tin.

Sử dụng phán đoán của riêng bạn để xác định xem điều này có thực sự tốt hơn hoặc dễ bảo trì hơn so với vòng lặp for.

+0

Ồ, xin cảm ơn. Nhưng thực ra tiếng vang chỉ là một ví dụ. Lệnh thực tế mà tôi muốn phát hành là "psql ... -f $ i" :-) –

+0

@dedeibel, câu trả lời được cập nhật. –

+0

Cảm ơn bạn đã cập nhật, không phải zsh cụ thể nhưng điều đó thật tuyệt. –

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