Lấy kích thước chỉ với tập tin


51

Làm cách nào tôi có thể nhận được kích thước của tất cả các tệp và tất cả các tệp trong thư mục con của nó bằng lệnh du.

Tôi đang thử lệnh sau để lấy kích thước của tất cả các tệp (và tệp trong thư mục con)

find . -type f | du -a

Nhưng điều này in ra các kích thước thư mục là tốt. Làm cách nào tôi có thể nhận được danh sách kích thước của tất cả các tệp và tệp trong thư mục con? Tôi cũng đã thử exec flagnhưng tôi không chắc chắn làm thế nào để chuyển đầu ra thành một lệnh khác sau khi nó thực hiện kết quả findvào du.

Hệ điều hành là AIX 6.1 với vỏ ksh.

Câu trả lời:


57

Tôi thường sử dụng các -exectiện ích. Như thế này:

find . -type f -exec du -a {} +

Tôi đã thử cả trên bash và ksh với GNU find. Tôi chưa bao giờ thử AIX, nhưng tôi chắc rằng phiên bản tìm kiếm của bạn có một số -execcú pháp.

Đoạn mã sau sắp xếp danh sách, lớn nhất trước:

find . -type f -exec du -a {} + | sort -n -r | less

3
Tôi sẽ đi với câu trả lời này nếu bạn không có quyền truy cập find -print0hoặc các tính năng GNU khác. Nếu có sẵn, thay thế \;bằng \+sẽ dẫn đến ít yêu cầu hơn duvà do đó hiệu suất tốt hơn.
jw013

Cảm ơn, điều này hoạt động rất tốt đặc biệt vì du cung cấp một cờ cho kích thước trong các đơn vị khác nhau.
Shardul Upadhyay

Tôi không thể tìm thấy thông tin về các +tùy chọn. Đó là một lựa chọn cho duhay cho find? Và tại sao nó dẫn đến ít cuộc gọi hơn?
Amelio Vazquez-Reina

1
Đó là một lựa chọn tiêu chuẩn của find. Nó chỉ định execlệnh (trong trường hợp của chúng tôi du) chỉ một lần, với tất cả các kết quả findđược đưa ra dưới dạng đối số liên tiếp cho lệnh.
rahmu

wtf, tại sao không có lệnh như thếdu -f --threshold=1G
Alexander Mills

16

Nếu bạn có tiện ích GNU, hãy thử

find . -type f -print0 | du --files0-from=-

Lệnh không nói print0 không phải là lệnh hợp lệ và điểm trừ cuối cùng không phải là cờ được công nhận. Tôi không nghĩ rằng phương pháp này sẽ hiệu quả vì man dukhông liệt kê một fileshoặc fromcờ.
Shardul Upadhyay

Bạn nên thêm hệ điều hành của bạn dưới dạng thẻ vào câu hỏi. Tôi giả sử bạn có GNU nhưng quên đề cập đến điều đó.
jw013

1
Có một upvote trên tôi! Giải pháp cụ thể của bạn hoạt động với du -chđể có được tổng số tệp phù hợp:find . -name 'blah blah.*' -print0 | du --files0-from=- -ch
Michael Goldshteyn

9

Tôi thường sử dụng:

find . -type f -print0 | xargs -r0 du -a

Xargs thường gọi lệnh, ngay cả khi không có đối số nào được thông qua; xargs du </dev/nullvẫn sẽ được gọi, xargs -r du </dev/nullsẽ không gọi du. Đối -0số tìm kiếm các chuỗi kết thúc null thay vì kết thúc dòng mới.

Sau đó, tôi thường thêm | awk '{sum+=$1} END {print sum}'vào cuối để có được tổng số.


2
Giá then I usually addtrị của vàng :-)
Radek

2

Đây là một phiên bản với tên tham số dài và sắp xếp con người.

find . -type f -exec du --human {} + | sort --human --reverse | head

Tôi cũng thấy không cần phải -a/--allthông qua du.


-2

tập tin cụ thể trong thư mục hiện tại

du -ch files*

ngắn hơn và làm việc cho tôi

du -sh .

cho thư mục hiện tại và tất cả các tệp trong phụ

du (lõi GNU) 8,30


1
(1) Ý của bạn là du -ch files*gì? Giả sử thư mục hiện hành chứa ant, apple, banana, bat, cat, corn, date, và dog, nơi tên động vật là các thư mục con và trái cây / rau tên là các tập tin - chỉ huy những gì bạn sẽ sử dụng để có được chỉ là tập tin? Hay đó không phải là ý bạn? (2)  du -sh .sẽ chỉ báo cáo tổng cộng tất cả mọi thứ trong và dưới thư mục hiện tại, chứ không phải bản thân các tệp. Điều này là khá nhiều trái ngược hoàn toàn với những gì câu hỏi yêu cầu.
G-Man nói 'Phục hồi Monica'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.