Có rất nhiều câu trả lời ở đây, nhiều trong số đó là trùng lặp. Tôi thấy ba xu hướng: chuyển qua cuộc gọi du thứ hai, sử dụng mã shell / awk phức tạp và sử dụng các ngôn ngữ khác.
Đây là một giải pháp tương thích POSIX sử dụng du và awk nên hoạt động trên mọi hệ thống.
Tôi đã thực hiện một cách tiếp cận hơi khác, thêm vào -x
để đảm bảo chúng tôi ở trên cùng một hệ thống tệp (Tôi chỉ cần thao tác này khi tôi thiếu không gian đĩa, vậy tại sao lại loại bỏ những thứ tôi đã gắn trong cây FS này hoặc di chuyển và symlinked back?) và hiển thị các đơn vị không đổi để phân tích hình ảnh dễ dàng hơn. Trong trường hợp này, tôi thường chọn không sắp xếp để tôi có thể thấy rõ hơn cấu trúc phân cấp.
sudo du -x | awk '
$1 > 2^20 { s=$1; $1=""; printf "%7sG%s\n", sprintf("%.2f",s/2^21), $0 }'
(Vì đây là đơn vị nhất quán, sau đó bạn có thể nối thêm | sort -n
nếu bạn thực sự muốn sắp xếp kết quả ed.)
Điều này lọc ra bất kỳ thư mục nào có nội dung (tích lũy) không vượt quá 512MB và sau đó hiển thị kích thước tính bằng gigabyte. Theo mặc định, du sử dụng một kích thước khối 512 byte (do đó tình trạng awk của 2 20 khối là 512MB và 2 của 21 ước chuyển đổi các đơn vị GB - chúng ta có thể sử dụng du -kx
với $1 > 512*1024
và s/1024^2
để có nhiều người có thể đọc được). Trong điều kiện awk, chúng tôi đặt s
kích thước để chúng tôi có thể xóa nó khỏi dòng ( $0
). Điều này giữ lại dấu phân cách (được thu gọn vào một khoảng trắng), vì vậy cuối cùng %s
đại diện cho một khoảng trắng và sau đó là tên của thư mục tổng hợp. %7s
căn chỉnh %.2f
kích thước GB được làm tròn (tăng lên %8s
nếu bạn có> 10TB).
Không giống như hầu hết các giải pháp ở đây, điều này hỗ trợ đúng cách các thư mục có khoảng trắng trong tên của chúng (mặc dù mọi giải pháp, bao gồm cả giải pháp này, sẽ xử lý sai tên thư mục có chứa ngắt dòng).