Làm thế nào để có được kích thước tóm tắt của các thư mục và thư mục con của chúng?


302

Giả sử tôi muốn lấy kích thước của mỗi thư mục của hệ thống tệp Linux. Khi tôi sử dụng, ls -latôi không thực sự có được kích thước tóm tắt của các thư mục.

Nếu tôi sử dụng, dftôi nhận được kích thước của mỗi hệ thống tệp được gắn nhưng điều đó cũng không giúp tôi. Và với dutôi có được kích thước của mỗi thư mục con và tóm tắt của toàn bộ hệ thống tệp.

Nhưng tôi muốn chỉ có kích thước tóm tắt của mỗi thư mục trong thư mục ROOT của hệ thống tệp. Có lệnh nào để đạt được điều đó?


Các --totallá cờ là hữu ích cho tôi. Ví dụ du -sh --total applications/*. Askubfox.com/a/465436/48214
Ryan

Câu trả lời:


427

Đây là những gì bạn đang tìm kiếm:

du -sh /*

Điều này có nghĩa là gì:

  • -s để chỉ cung cấp tổng số cho mỗi đối số dòng lệnh.
  • -hcho các hậu tố có thể đọc được của con người như Mcho megabyte và Gcho gigabyte (tùy chọn).
  • /*chỉ cần mở rộng đến tất cả các thư mục (và tệp) trong /.

    Lưu ý: không bao gồm dotfiles; chạy shopt -s dotglobđể bao gồm những người quá.

Cũng hữu ích là sắp xếp theo kích thước:

du -sh /* | sort -h

Đây:

  • -hđảm bảo sortdiễn giải các hậu tố có thể đọc được của con người một cách chính xác.

8
Nếu bạn có các thư mục dấu chấm trong thư mục gốc, bạn có thể sử dụng shopt -s dotglobđể đưa chúng vào số đếm.
Phi

8
Điều này rất hữu ích, bởi vì nó đơn giản và bạn có thể đặt đường dẫn nào bạn muốn thay vì /*, ví dụ ./cho thư mục hiện tại hoặc ./*cho từng mục trong thư mục hiện tại.
psur

3
@psur hoặc bạn có thể sử dụng ./*/để chỉ nhận các thư mục con và không phải tất cả các mục
di chuyển

7
Phiên bản được sắp xếp:du -sh /* | sort -h
Vũ Anh

2
@ c1phr Nếu bạn sortkhông có -h, bạn cũng cần phải loại bỏ nó du, nếu không việc sắp xếp sẽ trộn lẫn với kilo / mega / gigabyte. du -s /* | sort -nr.
Thomas

78

Tôi thường cần tìm các thư mục lớn nhất, vì vậy để có được một danh sách được sắp xếp chứa 20 thư mục lớn nhất tôi làm điều này:

du -m /some/path | sort -nr | head -n 20

Trong trường hợp này, kích thước sẽ được báo cáo bằng megabyte.


11
Đây là một cách để có được nó dễ đọc hơn du -sh / some / path | sắp xếp -hr | đầu -n 20
Xedecimal

6
@Xedecima vấn đề với việc sử dụng h là loại không biết cách xử lý các kích cỡ khác nhau. Ví dụ: 268K được sắp xếp cao hơn 255M và cả hai được sắp xếp cao hơn 2,7G
chrisan

4
Đối số -h (con người có thể đọc được) trên lệnh 'sort' nên đọc đúng các giá trị này. Giống như cờ của du -h xuất khẩu chúng. Tùy thuộc vào những gì bạn đang chạy tôi đoán.
Xedecimal

Hoạt động trong Ubuntu 16.04. Mẹo hay.
SDsolar

sudo du -haxt 1G / | sắp xếp -hr | đầu -30
lệch lạc

21

Tôi thích sử dụng Ncdu cho điều đó, bạn có thể sử dụng con trỏ để điều hướng và đi sâu vào cấu trúc thư mục mà nó hoạt động thực sự tốt.


Tuyệt vời. Từ khóa: du gặp ncurses. Bạn có thể sử dụng bđể thả vào một vỏ trong thư mục.
Ciro Santilli 新疆 改造 心 心 996ICU 六四

11

Các câu trả lời hiện tại rất hữu ích, có thể một số người mới bắt đầu (như tôi) cũng sẽ thấy điều này hữu ích.

  1. Vòng lặp rất cơ bản, nhưng đối với tôi đây là một khởi đầu tốt cho một số hoạt động liên quan đến kích thước khác:

    for each in $(ls) ; do du -hs "$each" ; done
    
  2. Rất giống với câu trả lời đầu tiên và kết quả gần giống với 1.), nhưng tôi phải mất một thời gian để hiểu sự khác biệt của * với ./* nếu trong thư mục con:

    du -sh ./*
    

for eachkhông hoạt động vì nó thêm các ký tự bảng điều khiển (ví dụ \033[) vào danh sách các thư mục
machineaddict

@machineaddict không chắc ý bạn là gì. Tôi sử dụng tất cả các thời gian, làm việc cho tôi tốt.
Martin

cố gắng chạy lệnh của bạn bắt đầu với for each. nó sẽ không hoạt động
machineaddict

tôi chạy lệnh chính xác như được viết ở đây. bắt đầu với mỗi. công trinh.
Martin

7

Lệnh dugọi sau sẽ hoạt động trên các hệ thống BSD:

du -d 1 /

1
My du(Ubuntu 10.4) không có -dtùy chọn. Bạn đang trên hệ thống nào?
Thomas

Trên openSUSE của tôi, nó không có tùy chọn -d :(
2ndkauboy

OK, sau đó chỉ là tùy chọn BSD (Tôi đang dùng OS X).
Phi

Kết hợp tùy chọn di động bên phải trên BSD / * NIX là du -sk /*. Tôi ghét những -kthứ rất nhiều. Linux ' -hhoàn toàn đá.
Dummy00001

trong các hệ thống khác, nó--max-depth
Vishnu Kumar

4

Điều này không dễ dàng. Các dulệnh hoặc thấy các tập tin và thư mục (mặc định) hay chỉ là kích thước của tất cả các mục mà bạn chỉ định trên dòng lệnh (tùy chọn -s).

Để có được các mục lớn nhất (tệp và thư mục), được sắp xếp, với kích thước có thể đọc được của con người trên Linux:

du -h | sort -h

Điều này sẽ chôn bạn trong một tấn các tập tin nhỏ. Bạn có thể loại bỏ chúng bằng --threshold(1 MB trong ví dụ của tôi):

du --threshold=1M -h | sort -h

Ưu điểm của lệnh này là nó bao gồm các thư mục dấu chấm ẩn (các thư mục bắt đầu bằng .).

Nếu bạn thực sự chỉ muốn các thư mục, bạn cần sử dụng findnhưng điều này có thể rất, rất chậm vì dusẽ phải quét nhiều thư mục nhiều lần:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h

1
--thrưỡng ^^ ^ tùy chọn này không có sẵn trên linux
podarok

1
@podarok Nó có sẵn trên OpenSUSE 13.2 Linux. Cố gắng tự tìm phiên bản phân phối mới hơn hoặc tự biên dịch phiên bản mới hơn của gói.
Aaron Digulla

Nó không hoạt động trên Ubuntu LTS (14.04). Đây là lần gần đây nhất))
podarok 7/10/2015

@podarok Phiên bản nào của GNU coreutils? Của tôi là 8,24.
Aaron Digulla

1
Bộ nhớ đệm có thể là một thuật ngữ xấu. Tôi đã nghĩ về một cái gì đó giống như được thực hiện trong cổng superuser.com/a/597173/121352 nơi chúng tôi quét nội dung đĩa một lần vào ánh xạ và sau đó tiếp tục sử dụng dữ liệu từ ánh xạ đó thay vì nhấn vào đĩa.
Hennes

1

Xin lưu ý rằng bạn không thể so sánh các thư mục với dutrên các hệ thống / máy khác nhau mà không chắc chắn, cả hai đều có chung kích thước khối của hệ thống tệp. Điều này có thể được tính nếu bạn rsync một số tệp từ máy linux sang máy tính và bạn muốn tự mình so sánh thư mục được đồng bộ hóa. Bạn có thể nhận được kết quả khác nhau duvì các khối khác nhau ....


0

Bạn cũng có thể muốn kiểm tra xdiskusage . Sẽ cung cấp cho bạn thông tin tương tự, nhưng được hiển thị bằng đồ họa, cộng với cho phép đi sâu vào (rất hữu ích). Có các tiện ích tương tự khác cho KDE và thậm chí Windows.


0

Bạn có thể sử dụng lskết hợp với awk:

ls -al * | awk 'BEGIN {tot=0;} {tot = tot + $5;} END {printf ("%.2fMb\n",tot/1024/1024);}'

Đầu ra của lsđược dẫn đến awk. awkbắt đầu xử lý dữ liệu. Dấu phân cách tiêu chuẩn là không gian. Biến tổng totđược khởi tạo bằng không; câu lệnh sau được thực thi cho mỗi hàng / dòng được xuất ra bởi ls. Nó chỉ tăng tottheo kích thước. $5là viết tắt của cột thứ năm (xuất ra bởi ls). Cuối cùng, chúng tôi chia cho (1024 * 1024) để tính bằng megabyte.

Nếu bạn chuyển đổi tập lệnh này thành tập lệnh hoặc hàm (.bashrc), bạn cũng có thể sử dụng tập lệnh này để lấy kích thước của các tập hợp con nhất định của thư mục, theo filetypes.

Nếu bạn muốn thông tin toàn hệ thống, kdirstatcó thể có ích!


Tôi đồng ý người ta có thể mở rộng ví dụ này và thực hiện các thủ thuật như lấy kích thước của "các tập hợp con nhất định của thư mục, theo filetypes", v.v .; nó có vẻ là một điểm khởi đầu tốt. Tuy nhiên, giải pháp này là thiếu sót ngay từ đầu. Đối với mọi người dùng muốn sử dụng phương pháp này, tôi khuyên bạn nên đọc câu trả lời và nhận xét cho câu hỏi này cũng như bài viết được liên kết ở đó . Tôi không nói bạn không thể làm điều đó cả. Biết những hạn chế, đó là tất cả.
Kamil Maciorowski
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.