Giải pháp
Bằng cách cung cấp tùy chọn -c
(hoặc --total
) cho du(1)
, bạn có thể hướng dẫn nó tạo ra tổng cộng lớn. Nếu việc triển khai du(1)
hỗ trợ một trong hai tùy chọn này, bạn có thể đạt được hiệu quả mong muốn bằng cách sử dụng lệnh sau:
$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +
EDIT: Lưu ý rằng nếu số lượng tệp vượt quá số lượng tham số tối đa được hệ thống của bạn cho phép, find
vẫn có thể thực thi command
nhiều lần. Một số triển khai du(1)
cũng hỗ trợ đọc tên tệp từ một tệp, không bị giới hạn đã đề cập:
$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames
Giải trình
Sự khác biệt giữa ngữ nghĩa của -exec command {} \;
và -exec command {} +
là như sau:
command {} \;
thực hiện command
một lần cho mỗi kết quả của find
. Tên đường dẫn của kết quả được thông qua thay vì {}
.
$ touch 1 2 3
$ find 1 2 3 -maxdepth 0 -exec echo {} \;
1
2
3
command {} +
thực hiện command
, khi tất cả các kết quả đã được lấy. Tên đường dẫn của kết quả được thông qua thay vì {}
.
$ touch 1 2 3
$ find 1 2 3 -maxdepth 0 -exec echo {} +
1 2 3
Các -print0
tùy chọn nguyên nhân find(1)
để in tên tập tin được tìm thấy đầu ra tiêu chuẩn phân cách bởi các ký tự null, và các --files0-from
tùy chọn gây ra du(1)
để đọc các tên tập tin null-tách ra. Không giống như ký tự dòng mới, ký tự null có thể không xuất hiện trong tên tệp, do đó đầu ra không rõ ràng.
Để tìm hiểu thêm về các tùy chọn của du(1)
và find(1)
, bạn nên tham khảo các trang hướng dẫn tương ứng:
$ man du
$ man find