Làm thế nào để liệt kê kích thước của từng tệp và thư mục và sắp xếp theo kích thước giảm dần trong Bash?


108

Tôi thấy rằng không có cách nào dễ dàng để có được kích thước của một thư mục trong Bash?

Tôi muốn rằng khi tôi nhập ls -<some options>, nó có thể liệt kê tất cả tổng kích thước tệp của thư mục một cách đệ quy và các tệp cùng một lúc và sắp xếp theo thứ tự kích thước.

Điều đó có thể không?


2
Chính xác thì ý bạn là gì về "kích thước" của một thư mục? Số lượng tệp dưới nó (đệ quy hay không)? Tổng kích thước của các tệp dưới nó (đệ quy hay không)? Kích thước đĩa của chính thư mục? (Một thư mục được thực hiện như một tập tin đặc biệt có chứa tên tập tin và các thông tin khác.)
Keith Thompson

nên Tổng số các kích thước của các tập tin dưới nó một cách đệ quy
Kit Hồ

1
@Kit: Sau đó dulà câu trả lời.
Keith Thompson

Lệnh @KeithThompson @KitHo duước tính mức sử dụng không gian tệp nên bạn không thể sử dụng nó nếu muốn lấy kích thước chính xác.
ztank1013

@ ztank1013: Tùy thuộc vào ý của bạn về "kích thước chính xác", du(ít nhất là phiên bản GNU coreutils) có thể có một tùy chọn để cung cấp thông tin.
Keith Thompson

Câu trả lời:


218

Chỉ cần điều hướng đến thư mục và chạy lệnh sau:

du -a --max-depth=1 | sort -n

HOẶC thêm -h cho các kích thước con người có thể đọc được và -r để in các thư mục / tệp lớn hơn trước.

du -a -h --max-depth=1 | sort -hr

23
du -hyêu cầu sort -hquá, để đảm bảo rằng, nói 981Mcác loại trước đây 1.3G; sort -nchỉ với những con số sẽ được tính đến và chúng sẽ sai lầm.
Smylers

Phần này không liệt kê kích thước của các tệp riêng lẻ trong thư mục hiện tại, chỉ liệt kê kích thước của các thư mục con và tổng kích thước của thư mục hiện tại. Làm thế nào bạn cũng sẽ bao gồm các tệp riêng lẻ trong đầu ra (để trả lời câu hỏi của OP)?
Erik Trautman

@ErikTrautman để liệt kê các tập tin cũng bạn cần phải thêm -avà sử dụng --allthay vì --max-depth=1như vậydu -a -h --all | sort -h
Franco

Tuyệt vời! Tôi đã làm một cái gì đó lamer trong một vài năm nay. :)
Colby Blair.

6
sort -hchỉ hoạt động trên phiên bản của GNU / Linux, không may mắn với BSD / OS X.
djule5

20

Rõ ràng --max-depthtùy chọn không có trong phiên bản dulệnh của Mac OS X. Bạn có thể sử dụng những thứ sau để thay thế.

du -h -d 1 | sort -n


Rõ ràng, nhưng không có gì đáng ngạc nhiên.
Josh Habdas

20
du -s -- * | sort -n

(điều này sẽ không hiển thị các tệp (.dotfiles) ẩn)

Sử dụng du -smcho đơn vị Mb, v.v. Tôi luôn sử dụng

du -smc -- * | sort -n

bởi vì tổng dòng ( -c) sẽ kết thúc ở dưới cùng vì những lý do rõ ràng :)

Tái bút:

  • Xem nhận xét để xử lý dotfiles
  • Tôi thường sử dụng ví dụ: 'du -smc / home / / | sắp xếp -n | tail 'để có cảm giác chính xác vị trí của các bit lớn

5
du --max-depth=1|sort -nhoặc find . -mindepth 1 -maxdepth 1|xargs du -s|sort -nđể bao gồm cả tệp dotfiles.
Arnaud Le Blanc

@arnoud: Tôi cũng sử dụng cái đó, nhưng nó có vẻ không phải là sự bổ sung phù hợp cho câu hỏi này (/ answer) :)
sehe

@ arnaud576875 find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -nnếu một số đường dẫn được tìm thấy có thể chứa khoảng trắng.
Lri

1
Đây là một biến thể tuyệt vời để có một cái nhìn có thể đọc được con người trong những lớn nhất:sudo du -smch * | sort -h | tail
marsbard

16

Chỉ huy

du -h --max-depth=0 * | sort -hr

Đầu ra

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

Giải trình

  • du hiển thị "sử dụng đĩa"
  • h dành cho "con người có thể đọc được" (cả hai, trong loại và trong du)
  • max-depth=0nghĩa là dusẽ không hiển thị kích thước của các thư mục con (loại bỏ điều đó nếu bạn muốn hiển thị tất cả kích thước của mọi tệp trong mọi thư mục con, subsub-, ...,)
  • r là "đảo ngược" (tệp lớn nhất trước)

ncdu

Khi tôi hỏi câu hỏi này, tôi muốn dọn dẹp hệ thống tệp của mình. Công cụ dòng lệnh ncduphù hợp hơn với tác vụ này.

Cài đặt trên Ubuntu:

$ sudo apt-get install ncdu

Sử dụng:

Chỉ cần gõ ncdu [path]vào dòng lệnh. Sau một vài giây để phân tích đường dẫn, bạn sẽ thấy một cái gì đó như thế này:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

Xóa phần tử hiện được đánh dấu bằng d, thoát bằng CTRL+c


Bạn cũng có thể viết du -hs * | sắp xếp -hr. -s (Tóm tắt) là giống như max-depth = 0
rasmusx

5

ls -Sphân loại theo kích thước. Sau đó, để hiển thị kích thước, hãy hiển thị ls -lSdài ( -l), được sắp xếp theo kích thước ( -S). Tôi cũng thường thêm vào -h, để làm cho mọi thứ dễ đọc hơn, vì vậy ls -lhS,.


1
Ah, xin lỗi, điều đó không rõ ràng từ bài đăng của bạn. Bạn muốn du, có vẻ như ai đó đã đăng nó. @sehe: Tùy thuộc vào định nghĩa của bạn về real - nó hiển thị lượng không gian mà thư mục đang sử dụng để lưu trữ chính nó. (Nó không chỉ tăng kích thước của các subentries.) Nó không phải là một số ngẫu nhiên và không phải lúc nào cũng 4KiB.
Thanatos

1

Đơn giản và nhanh chóng:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* yêu cầu GNU Parallel .


0

Tôi nghĩ rằng tôi có thể đã tìm ra những gì bạn muốn làm. Điều này sẽ cung cấp một danh sách được sắp xếp của tất cả các tệp và tất cả các thư mục, được sắp xếp theo kích thước tệp và kích thước của nội dung trong các thư mục.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n

Đừng bận tâm, sehe đã trình bày một giải pháp đơn giản hơn nhiều. Tôi học một cái gì đó mới mỗi ngày!
dvorak

Tôi không nghĩ sử dụng dulà một tùy chọn, Nó sẽ cung cấp cho bạn một kết quả gần đúng.
ztank1013 19/09

0

[phiên bản nâng cao]
Điều này sẽ nhanh hơn và chính xác hơn nhiều so với phiên bản ban đầu bên dưới và sẽ xuất ra tổng kích thước tệp của thư mục hiện tại:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

các stat -c %slệnh trên một tập tin sẽ trở lại kích thước của nó bằng byte. Các trlệnh ở đây được sử dụng để khắc phục xargsnhững hạn chế lệnh (hình như đường ống để xargslà kết quả tách trên nhiều dòng, phá vỡ logic của lệnh của tôi). Do đó, trviệc thay thế nguồn cấp dữ liệu dòng bằng dấu +(cộng). sedcó mục tiêu duy nhất là xóa +ký hiệu cuối cùng khỏi chuỗi kết quả để tránh phàn nàn từ cuối cùngbc (máy tính cơ bản), như thường lệ, thực hiện phép toán.

Hiệu suất: Tôi đã thử nghiệm nó trên một số thư mục và hơn ~ 150.000 tệp trên cùng (số tệp hiện tại của hộp fedora 15 của tôi) và tôi tin rằng đó là một kết quả đáng kinh ngạc:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

Chỉ trong trường hợp bạn muốn so sánh với du -sb /lệnh, nó sẽ xuất ra mức sử dụng đĩa ước tính theo byte ( -btùy chọn)

# du -sb /
12684646920 /

Như tôi đã mong đợi, nó lớn hơn một chút so với tính toán lệnh của tôi vì dutiện ích trả về không gian được cấp phát của mỗi tệp chứ không phải không gian được tiêu thụ thực tế.

[phiên bản đầu tiên]
Bạn không thể sử dụng dulệnh nếu bạn cần biết kích thước tổng chính xác của thư mục vì (theo trích dẫn trang nam) duước tính mức sử dụng dung lượng tệp. Do đó, nó sẽ dẫn bạn đến một kết quả sai, một kết quả gần đúng (có thể gần với kích thước tổng nhưng rất có thể lớn hơn kích thước thực mà bạn đang tìm kiếm).

Tôi nghĩ có thể có nhiều cách khác nhau để trả lời câu hỏi của bạn nhưng đây là của tôi:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Nó tìm thấy tất cả các tệp dưới. thư mục (thay đổi. với bất kỳ thư mục nào bạn thích), các tệp ẩn cũng được bao gồm và (sử dụng xargs) xuất tên của chúng trong một dòng duy nhất, sau đó tạo danh sách chi tiết bằng cách sử dụng ls -l. Đầu ra khổng lồ (đôi khi) này được chuyển hướng tới lệnh cắt và chỉ trường thứ năm ( -f5), là kích thước tệp tính bằng byte được lấy và một lần nữa được đưa vàoxargs để tạo ra một dòng kích thước duy nhất được phân tách bằng khoảng trống. Bây giờ thực hiện một phép thuật sed thay thế mỗi khoảng trống bằng dấu cộng ( +) và cuối cùng bc(máy tính cơ bản) thực hiện phép toán.

Nó có thể cần điều chỉnh bổ sung và bạn có thể gặp lslệnh phàn nàn về danh sách đối số quá dài.


nếu diretory là quá lớn, nó bị treo lên trong một thời gian dài, hãy cố gắng làm việc trên thư mục chính của bạn: p
Kit Hồ

@KitHo tốt, tôi e rằng không có cách nào dễ dàng và nhanh chóng để có được kết quả chính xác mà không cần tìm kiếm từng tệp và thêm kích thước của nó, do đó, sự lười biếng của lệnh chủ yếu phụ thuộc vào số lượng tệp bên dưới thư mục đã tìm kiếm ... Nhưng tôi tin là có là lợi nhuận cho những cải tiến ... thử thách tốt đẹp!
ztank1013 19/09

@KitHo này, hãy xem phiên bản nâng cao trong câu trả lời của tôi ... và tất nhiên là hãy cho tôi biết!
ztank1013 19/09

0

Một giải pháp đơn giản khác.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

kết quả sẽ như thế nào

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

thay đổi "du -s" thành "du -sh" sẽ hiển thị kích thước có thể đọc được của con người, nhưng chúng tôi sẽ không thể sắp xếp theo phương pháp này.


0

bạn có thể sử dụng phần dưới đây để liệt kê các tệp theo kích thước du -h | sắp xếp -hr | nhiều hơn hoặc du -h --max-depth = 0 * | sắp xếp -hr | hơn


0

Tôi có xu hướng sử dụng du một cách đơn giản.

du -sh */ | sort -n

Điều này cung cấp cho tôi một ý tưởng về những thư mục nào đang chiếm nhiều dung lượng nhất. Sau đó, tôi có thể chạy các tìm kiếm chính xác hơn sau này.


Loại này hoạt động, nhưng bỏ qua các đơn vị về kích thước của tệp khi sắp xếp.
Benjamin Engwall
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.