2012-02-15 29 views
5

Tôi đang cố sử dụng lệnh du cho mọi thư mục trong thư mục hiện tại. Vì vậy, tôi đang cố gắng sử dụng mã như sau:Tại sao du hoặc echo pipelining không hoạt động?

ls | du -sb 

Nhưng nó không hoạt động như mong đợi. Nó chỉ xuất ra kích thước hiện tại '.' thư mục và thats tất cả. Điều tương tự là với tiếng vang

ls | echo 

Đầu ra dòng trống. Tại sao chuyện này đang xảy ra?

Trả lời

11

Sử dụng một ống gửi đầu ra (stdout) của lệnh đầu tiên, để stdin (đầu vào) của quá trình con (lệnh thứ 2). Các lệnh bạn đã đề cập không lấy bất kỳ đầu vào nào trên stdin. Điều này sẽ làm việc, ví dụ, với cat (và do công việc, tôi có nghĩa là làm việc như cat chạy không có đối số, và chỉ cần vượt qua cùng đầu vào bạn cho nó):

ls | cat 

Đối với các ứng dụng của bạn, đây là nơi xargs đi vào. Nó lấy đầu vào đường ống và cho nó làm đối số cho lệnh được chỉ định. Vì vậy, bạn có thể làm cho nó hoạt động như:

ls | xargs du -sb 

Ghi chú rằng theo mặc định xargs sẽ phá vỡ đầu vào của nó vào không gian, vì vậy nếu tên tập tin của bạn chứa khoảng trắng này sẽ không làm việc như bạn muốn. Vì vậy, trong trường hợp cụ thể này, đây sẽ là tốt hơn:

du -sb * 
+0

gì du -sb * nghĩa ? – Romeno

+0

'*' là một glob (hoặc ký tự đại diện như bạn có thể biết). Shell sẽ thay thế nó bằng tất cả tên tệp (hoặc thư mục, vv) trong thư mục hiện tại khớp với nó. Y cũng có thể, ví dụ: nói '* .jpg' để khớp với bất kỳ tệp nào kết thúc bằng .jpg – FatalError

2
$ find . -type d -maxdepth 1 -exec du -sb {} \; 

hoặc

$ ls -d */ | xargs du -sb 
3

Sử dụng lệnh thay thế, như thế này:

du -sb $(ls -d */) 
Các vấn đề liên quan