Sử dụng ls để liệt kê các thư mục và tổng kích thước của chúng


828

Có thể sử dụng lstrong Unix để liệt kê tổng kích thước của thư mục con và tất cả nội dung của nó trái ngược với thông thường 4Kmà (tôi giả sử) chỉ là chính tệp thư mục?

total 12K
drwxrwxr-x  6 *** *** 4.0K 2009-06-19 10:10 branches
drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags
drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk

Sau khi quét các trang người đàn ông tôi đang trống rỗng.


4
thay vào đó, bạn muốn sử dụng du -s
súng

21
Trong một cuộc tìm kiếm vịt:alias ducks='du -cksh * | sort -hr | head -n 15'
Sebi

Câu trả lời:


1550

Hãy thử một cái gì đó như:

du -sh *

phiên bản ngắn của:

du --summarize --human-readable *

Giải trình:

du: D isk U hiền

-s: Hiển thị một bản tóm tắt cho mỗi tệp được chỉ định. (Tương đương -d 0)

-h: Đầu ra "Con người có thể đọc được". Sử dụng các hậu tố đơn vị: B yte , K ibibyte (KiB), M ebibyte (MiB), G ibibyte (GiB), T ebibyte (TiB) và P ebibyte (PiB). (BASE2)


55
Ngoài ra -c (sản xuất một tổng số lớn) là tốt đẹp.
meridius

50
du --max-height 1 chỉ hiển thị kích thước tệp / thư mục của 1 sâu trong cây, không còn lộn xộn và dễ dàng tìm thấy các thư mục lớn trong một thư mục.
CousinCocaine

12
Làm thế nào để bao gồm các tập tin ẩn quá?
Zakaria Braksa

5
@Zak trong zsh bạn có thể sử dụng *(D)để khớp các tệp bị ẩn ( d ot) cùng với các tệp bình thường. Khi sử dụng bash, bạn có thể sử dụng * .[!.]*để khớp cả hai.
Sebi

22
Để có được một hình ảnh rõ ràng về nơi không gian đi, du -sch * .[!.]* | sort -rhthật tuyệt vời (hiển thị một đầu ra được sắp xếp) Trên mac do: brew install coreutilsvà sau đódu -sch * .[!.]* | gsort -rh
Guig

319

du -sk * | sort -nsẽ sắp xếp các thư mục theo kích thước. Hữu ích khi tìm kiếm không gian trống ..


11
Nối một | tail -rđể sắp xếp theo lớn nhất đầu tiên.
Phrogz

68
sort -rnsắp xếp mọi thứ theo thứ tự số ngược. sort -rn | head -n 10sẽ chỉ hiển thị một vài số hàng đầu, nếu đó là bất kỳ lợi ích nào.
AgileTillIDie 17/03/2016

14
sort -rhsẽ hoạt động độc đáo du -cksh *khi nó sắp xếp các đơn vị có thể đọc được.
Sebi

@Sebi -h không phải là một tham số hợp lệ để sắp xếp trên máy Mac
anon58192932

@Sebi cũng không cần thiết, du -ksh | sort -rncũng giống như du -cksh | sort -rn. Cũng du -kshgiống như là du -cksh.
xin chào_there_andy

108
du -sh * | sort -h

Điều này sẽ được hiển thị ở định dạng có thể đọc được.


6
Thông tin thêm về sort -hở đây: gnu.org/software/coreutils/manual/... Nó đặc biệt có để phân loại 103K, 102M, 1.1Gvv Điều này nên có sẵn trên rất nhiều các hệ thống hiện nay, nhưng không phải tất cả.
Evgeni Sergeev

duh -shm * | sắp xếp -n?
std''OrgnlDave

10
hoạt động tuyệt vời, một bổ sung nhỏ du -sh * | sort -rh(-r để liệt kê các thư mục lớn hơn trước)
artm

Để bao gồm các tập tin / thư mục ẩn; du -sh $(ls -A) | sort -h
jmd_dk

55

Để liệt kê các thư mục lớn nhất từ ​​thư mục hiện tại ở định dạng có thể đọc được:

du -sh * | sort -hr

Một cách tốt hơn để hạn chế số lượng hàng có thể là

du -sh * | sort -hr | head -n10

Nơi bạn có thể tăng hậu tố -ncờ để hạn chế số lượng hàng được liệt kê

Mẫu vật:

[~]$ du -sh * | sort -hr
48M app
11M lib
6.7M    Vendor
1.1M    composer.phar
488K    phpcs.phar
488K    phpcbf.phar
72K doc
16K nbproject
8.0K    composer.lock
4.0K    README.md

Nó làm cho nó thuận tiện hơn để đọc :)


27

Để hiển thị nó ở ls -lhđịnh dạng, sử dụng:

(du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }'

Mã Awk giải thích:

if($1 == "total") { // Set X when start of ls is detected
  X = 1 
} else if (!X) { // Until X is set, collect the sizes from `du`
  SIZES[$2] = $1
} else {
  // Replace the size on current current line (with alignment)
  sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); 
  print $0
}

Đầu ra mẫu:

drwxr-xr-x 2 root     root 4.0K    Feb 12 16:43 cgi-bin
drwxrws--- 6 root     www  20M     Feb 18 11:07 document_root
drwxr-xr-x 3 root     root 1.3M    Feb 18 00:18 icons
drwxrwsr-x 2 localusr www  8.0K    Dec 27 01:23 passwd

bất kỳ cách nào để sắp xếp đầu ra này? Ngoài ra, đối với bất kỳ ai trên mac, công cụ này sẽ hoạt động rất tốt nếu bạn xóa--color=no
anon58192932

@ anon58192932 Bạn có thể dẫn đầu ra để sort --key=5,5hsắp xếp 'các đơn vị có thể đọc được của con người' từ cột thứ năm
Sebi

trả lại sort: stray character in field spec: invalid field specification 5,5h'`. Đôi khi tôi thực sự ghét
macs

@ anon58192932 Bạn có thể hỏi một câu hỏi liên quan đến mac, tôi chắc chắn có ai đó có thể giúp đỡ. Câu hỏi này được gắn thẻ là GNU / linux
Sebi

2
Có cách nào để giữ màu bằng câu trả lời này không?
Pablo Canseco

20

Lệnh bạn muốn là 'du -sk' du = "sử dụng đĩa"

Cờ -k cung cấp cho bạn đầu ra tính bằng kilobyte, thay vì mặc định của các thành phần đĩa (khối 512 byte).

Cờ -s sẽ chỉ liệt kê những thứ trong thư mục cấp cao nhất (nghĩa là thư mục hiện tại, theo mặc định hoặc thư mục được chỉ định trên dòng lệnh). Thật kỳ lạ khi du có hành vi ngược lại của ls về vấn đề này. Theo mặc định, du sẽ cung cấp cho bạn cách sử dụng đĩa của từng thư mục con. Ngược lại, ls sẽ chỉ cung cấp các tệp danh sách trong thư mục được chỉ định. (ls -R cung cấp cho bạn hành vi đệ quy.)


Đã thử điều này trên thư mục gốc, nó vẫn cố gắng liệt kê các thư mục con, dẫn đến rất nhiều tin nhắn.
Nagev 30/03/2017

14

Đặt khai báo hàm shell này trong các tập lệnh khởi tạo shell của bạn:

function duls {
    paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}

Tôi gọi nó dulsbởi vì nó hiển thị đầu ra từ cả hai duls(theo thứ tự đó):

$ duls
210M    drwxr-xr-x  21 kk  staff  714 Jun 15 09:32 .

$ duls *
 36K    -rw-r--r--   1 kk  staff    35147 Jun  9 16:03 COPYING
8.0K    -rw-r--r--   1 kk  staff     6962 Jun  9 16:03 INSTALL
 28K    -rw-r--r--   1 kk  staff    24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--   1 kk  staff       75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--   1 kk  staff    24473 Jun 10 13:26 Makefile.in
4.0K    -rw-r--r--   1 kk  staff     1689 Jun  9 16:03 README
120K    -rw-r--r--   1 kk  staff   121585 Jun 10 13:26 aclocal.m4
684K    drwxr-xr-x   7 kk  staff      238 Jun 10 13:26 autom4te.cache
128K    drwxr-xr-x   8 kk  staff      272 Jun  9 16:03 build
 60K    -rw-r--r--   1 kk  staff    60083 Jun 10 13:26 config.log
 36K    -rwxr-xr-x   1 kk  staff    34716 Jun 10 13:26 config.status
264K    -rwxr-xr-x   1 kk  staff   266637 Jun 10 13:26 configure
8.0K    -rw-r--r--   1 kk  staff     4280 Jun 10 13:25 configure.ac
7.0M    drwxr-xr-x   8 kk  staff      272 Jun 10 13:26 doc
2.3M    drwxr-xr-x  28 kk  staff      952 Jun 10 13:26 examples
6.2M    -rw-r--r--   1 kk  staff  6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz
 11M    drwxr-xr-x  42 kk  staff     1428 Jun 10 13:26 src

$ duls doc
7.0M    drwxr-xr-x  8 kk  staff  272 Jun 10 13:26 doc

$ duls [bM]*
 28K    -rw-r--r--  1 kk  staff  24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--  1 kk  staff     75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--  1 kk  staff  24473 Jun 10 13:26 Makefile.in
128K    drwxr-xr-x  8 kk  staff    272 Jun  9 16:03 build

Giải trình:

Các pastetiện ích tạo ra các cột từ đầu vào của nó theo đặc điểm kỹ thuật mà bạn cung cấp cho nó. Đưa ra hai tệp đầu vào, nó đặt chúng cạnh nhau, với một tab là dấu phân cách.

Chúng tôi cung cấp cho nó đầu ra du -hs -- "$@" | cut -f1là tệp đầu tiên (thực sự là luồng đầu vào) và đầu ra ls -ld -- "$@"là tệp thứ hai.

Trong hàm, "$@"sẽ đánh giá vào danh sách tất cả các đối số dòng lệnh, mỗi đối số trong dấu ngoặc kép. Do đó, nó sẽ hiểu các ký tự và tên đường dẫn có dấu cách, v.v.

Dấu trừ kép ( --) báo hiệu kết thúc các tùy chọn dòng lệnh đến duls. Không có những điều này, nói duls -lsẽ gây nhầm lẫn duvà bất kỳ tùy chọn nào cho duđiều lsđó không có sẽ gây nhầm lẫnls (và các tùy chọn tồn tại trong cả hai tiện ích có thể không có nghĩa giống nhau, và nó sẽ là một mớ hỗn độn).

Sau cutkhi duchỉ cần cắt ra cột đầu tiên của du -hsđầu ra (kích thước).

Tôi quyết định đặt duđầu ra ở bên trái, nếu không tôi sẽ phải quản lý một cột bên phải chao đảo (do độ dài khác nhau của tên tệp).

Lệnh sẽ không chấp nhận cờ dòng lệnh.

Điều này đã được thử nghiệm trong cả bashvà trong ksh93. Nó sẽ không hoạt động với /bin/sh.


Điều đó thật tuyệt. Quyền kích cỡ trên một dòng
Ben

7

Tôi luôn luôn sử dụng du -sk( -kcờ hiển thị kích thước tệp tính bằng kilobyte) thay vào đó.


5
đây phải là một nhận xét, cung cấp thông tin bổ sung cho câu trả lời được chấp nhận chính xác hơn và được giải thích tốt hơn bởi @molf. Nó không nên được coi là một câu trả lời của riêng nó
code_monk


7

ncdu lời khuyên du

Tiện ích CLI tuyệt vời này cho phép bạn dễ dàng tìm thấy các tệp và thư mục lớn một cách tương tác.

Ví dụ, từ bên trong cây của một dự án nổi tiếng, chúng tôi làm:

sudo apt-get install ncdu
ncdu

Kết quả của nó:

nhập mô tả hình ảnh ở đây

Sau đó, tôi nhập xuống và ngay trên bàn phím để vào /driversthư mục và tôi thấy:

nhập mô tả hình ảnh ở đây

ncdu chỉ tính toán kích thước tệp một cách đệ quy một lần khi khởi động cho toàn bộ cây, vì vậy nó có hiệu quả.

"Tổng mức sử dụng đĩa" so với "Kích thước biểu kiến" tương tự như duvậy và tôi đã giải thích nó tại: tại sao đầu ra của `du` thường khác với` du -b`

Trang chủ dự án: https://dev.yorhel.nl/ncdu

Câu hỏi liên quan:

Đã thử nghiệm trong Ubuntu 16.04.

ncdu sử dụng không tương tác

Một tính năng thú vị khác ncdulà trước tiên bạn có thể kết xuất các kích thước theo định dạng JSON và sau đó sử dụng lại chúng.

Ví dụ: để tạo tệp chạy:

ncdu -o ncdu.json

và sau đó kiểm tra nó một cách tương tác với:

ncdu -f ncdu.json

Điều này rất hữu ích nếu bạn đang xử lý một hệ thống tệp rất lớn và chậm như NFS.

Bằng cách này, trước tiên bạn chỉ có thể xuất một lần, có thể mất hàng giờ, sau đó khám phá các tệp, thoát, khám phá lại, v.v.

Định dạng đầu ra chỉ là JSON, vì vậy cũng dễ dàng sử dụng lại nó với các chương trình khác, ví dụ:

ncdu -o -  | python -m json.tool | less

cho thấy một cấu trúc dữ liệu cây thư mục đơn giản:

[
    1,
    0,
    {
        "progname": "ncdu",
        "progver": "1.12",
        "timestamp": 1562151680
    },
    [
        {
            "asize": 4096,
            "dev": 2065,
            "dsize": 4096,
            "ino": 9838037,
            "name": "/work/linux-kernel-module-cheat/submodules/linux"
        },
        {
            "asize": 1513,
            "dsize": 4096,
            "ino": 9856660,
            "name": "Kbuild"
        },
        [
            {
                "asize": 4096,
                "dsize": 4096,
                "ino": 10101519,
                "name": "net"
            },
            [
                {
                    "asize": 4096,
                    "dsize": 4096,
                    "ino": 11417591,
                    "name": "l2tp"
                },
                {
                    "asize": 48173,
                    "dsize": 49152,
                    "ino": 11418744,
                    "name": "l2tp_core.c"
                },

Đã thử nghiệm trong Ubuntu 18.04.


1
Kinh ngạc. Cám ơn vì đã chia sẻ!
Frank Fu

Tôi đồng ý, ncdu là con đường để đi ... nhưng bạn có biết liệu có thể tìm kiếm tệp JSON không? Đó là, có được đường dẫn đầy đủ của một tập tin / thư mục cụ thể.
FGV

1
@FGV Tôi không nghĩ ncdu có thể tạo ra điều đó, một khả năng có thể là hack một tập lệnh python đơn giản để phân tích cú pháp JSON.
Ciro Santilli 冠状 病毒 审查 事件


4

Đây là một cái tôi thích

Cập nhật : Tôi không thích cái trước vì nó không hiển thị các tệp trong thư mục hiện tại, nó chỉ liệt kê các thư mục.

Ví dụ đầu ra cho /vartrên Ubuntu:

sudo du -hDaxd1 /var | sort -h | tail -n10

4.0K    /var/lock
4.0K    /var/run
4.0K    /var/www
12K     /var/spool
3.7M    /var/backups
33M     /var/log
45M     /var/webmin
231M    /var/cache
1.4G    /var/lib
1.7G    /var

3

Đây là tất cả những gợi ý tuyệt vời, nhưng cái tôi sử dụng là:

du -ksh * | sort -n -r

-ksh đảm bảo các tệp và thư mục được liệt kê ở định dạng có thể đọc được và tính bằng megabyte, kilobyte, v.v. Sau đó, bạn sắp xếp chúng theo số và đảo ngược sắp xếp để đặt các tệp lớn hơn trước.

Nhược điểm duy nhất của lệnh này là máy tính không biết rằng Gigabyte lớn hơn Megabyte nên nó sẽ chỉ sắp xếp theo số và bạn sẽ thường tìm thấy các danh sách như thế này:

120K
12M
4G

Chỉ cần cẩn thận để nhìn vào đơn vị.

Lệnh này cũng hoạt động trên Mac (trong khi sort -hkhông có ví dụ).


Nếu bạn xóa -hcờ khỏi dulệnh bạn cắt giảm nhược điểm đó
Carlos Ricardo

Hoặc bạn có thể sử dụng -hthay vì -nsắp xếp là tốt.
Sebi

hay chỉ là ống thông qua một grep G
gforce89

3
du -S

du có một tùy chọn hữu ích khác: -S, --separate-dirsnói du không bao gồm kích thước của thư mục con - tiện dụng trong một số trường hợp.

Ví dụ 1 - chỉ hiển thị kích thước tệp trong một thư mục:

du -Sh  * 
3,1G    10/CR2
280M    10

Ví dụ 2 - hiển thị kích thước tệp và thư mục con trong thư mục:

du -h  * 
3,1G    10/CR2 
3,4G    10



2

chỉ là một cảnh báo, nếu bạn muốn so sánh kích thước của các tập tin. du tạo ra các kết quả khác nhau tùy thuộc vào hệ thống tệp, kích thước khối, ....

Có thể xảy ra rằng kích thước của các tệp là khác nhau, ví dụ: so sánh cùng một thư mục trên đĩa cứng cục bộ của bạn và thiết bị lưu trữ dung lượng lớn USB. Tôi sử dụng tập lệnh sau, bao gồm ls để tổng hợp kích thước thư mục. Kết quả tính bằng byte lấy tất cả các thư mục con vào tài khoản.

echo "[GetFileSize.sh] target directory: \"$1\""

iRetValue=0

uiLength=$(expr length "$1")
if [ $uiLength -lt 2 ]; then
  echo "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!"
  iRetValue=-1
else
  echo "[GetFileSize.sh] computing size of files..."

  # use ls to compute total size of all files - skip directories as they may
  # show different sizes, depending on block size of target disk / file system
  uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}')
  uiLength=$(expr length "$uiTotalSize")
  if [ $uiLength -lt 1 ]; then
    uiTotalSize=0
  fi
  echo -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\""

fi

exit "$iRetValue"

1

Để hiển thị đệ quy các tệp và thư mục con của thư mục hiện tại:

du -h .

Để hiển thị thông tin cùng kích thước nhưng không in đệ quy các thư mục con của chúng (có thể là một danh sách lớn), chỉ cần sử dụng tùy chọn --max-height :

du -h --max-depth=1 .

1

Trong một thời gian, tôi đã sử dụng Nautilus (trên máy tính để bàn Gnome trên RHEL 6.0) để xóa các tệp trong thư mục nhà của tôi thay vì sử dụng rmlệnh trong bash. Kết quả là, tổng kích thước được hiển thị bởi

du -sh

không khớp với tổng mức sử dụng đĩa của từng thư mục con, khi tôi sử dụng

du -sh *

Phải mất một thời gian tôi mới nhận ra Nautilus gửi các tệp đã xóa vào thư mục Thùng rác của mình và thư mục đó không được liệt kê trong du -sh *lệnh. Vì vậy, chỉ muốn chia sẻ điều này, trong trường hợp ai đó phải đối mặt với cùng một vấn đề.


1

Hmm, cách tốt nhất là sử dụng lệnh này:

du -h -x / | sort -hr >> /home/log_size.txt

Sau đó, bạn sẽ có thể nhận được tất cả các thư mục kích thước trên tất cả các máy chủ của bạn. Dễ dàng giúp bạn tìm kích thước lớn nhất.


1

Sau đây là dễ nhớ

ls -ltrapR

liệt kê nội dung thư mục

-l sử dụng một định dạng danh sách dài

-t sắp xếp theo thời gian sửa đổi, mới nhất trước

-r, - đảo ngược thứ tự ngược trong khi sắp xếp

-a, --all đừng bỏ qua các mục bắt đầu bằng.

-p, --indicator-style = slash append / Indicator vào thư mục

Thư mục con -R, --recursive đệ quy

https://explainshell.com/explain?cmd=ls+-ltrapR


1

Nếu bạn muốn kiểm soát nhiều hơn những sizegì bạn muốn liệt kê các thư mục trên, bạn có thể sử dụng khóa chuyển đổi threshold( -t) như trong:

$ du -ht 1000000000 | sort --reverse

du- disk usage
h - định dạng có thể đọc được của con người
t - kích thước ngưỡng

Ở đây, chúng tôi muốn liệt kê tất cả các thư mục có kích thước lớn hơn 1GB.

$ du -ht 1G | sort --reverse

Giải thích :

Các đơn vị được mô tả trong wiki sau:

K, M, G, T, P, E, Z, Y (lũy thừa 1024) hoặc
KB, MB, GB, TB, PB, EB, ZB, YB (lũy thừa 1000).


0

Tôi gặp phải một vấn đề tương tự như những gì Martin Wilde đã mô tả, trong trường hợp của tôi so sánh cùng một thư mục trên hai máy chủ khác nhau sau khi phản chiếu với rsync.

Thay vì sử dụng tập lệnh, tôi đã thêm -bcờ vào duđó để đếm kích thước tính theo byte và theo như tôi có thể xác định đã loại bỏ sự khác biệt trên hai máy chủ. Bạn vẫn có thể sử dụng -s -hđể có được một đầu ra dễ hiểu.


0

đặt trong init script như .bashrc ... điều chỉnh def khi cần.

duh() {
  # shows disk utilization for a path and depth level
  path="${1:-$PWD}"
  level="${2:-0}"
  du "$path" -h --max-depth="$level"
}

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.