Tổng kích thước nội dung của tất cả các tệp trong một thư mục [đã đóng]


103

Khi tôi sử dụng lshoặc du, tôi nhận được dung lượng đĩa mà mỗi tệp đang chiếm.

Tôi cần tổng của tất cả dữ liệu trong các tệp và thư mục con mà tôi sẽ nhận được nếu tôi mở từng tệp và đếm các byte. Điểm thưởng nếu tôi có thể nhận được điều này mà không cần mở từng tệp và đếm.


1
lsthực sự hiển thị số byte trong mỗi tệp chứ không phải dung lượng ổ đĩa. Điều này có đủ cho nhu cầu của bạn?
Greg Hewgill

3
Lưu ý rằng dukhông thể được sử dụng để trả lời cho câu hỏi này. Nó cho biết dung lượng ổ đĩa mà thư mục chiếm trên đĩa (dữ liệu của tệp cộng với kích thước của thông tin meta hệ thống tệp bổ trợ). Đầu dura thậm chí có thể nhỏ hơn tổng kích thước của tất cả các tệp. Điều này có thể xảy ra nếu hệ thống tệp có thể lưu trữ dữ liệu được nén trên đĩa hoặc nếu các liên kết cứng được sử dụng. Câu trả lời đúng dựa trên lsfind. Xem câu trả lời của Nelsonbytepan tại đây hoặc câu trả lời sau: unix.stackexchange.com/a/471061/152606
anton_rh

Câu trả lời:


108

Nếu bạn muốn 'kích thước biểu kiến' (đó là số byte trong mỗi tệp), không phải kích thước mà các tệp trên đĩa chiếm dụng, hãy sử dụng tùy chọn -bhoặc --bytes(nếu bạn có hệ thống Linux với GNU coreutils ):

% du -sbh <directory>

1
hoạt động trên hộp mũ đỏ mới hơn của tôi, tiếc là không hoạt động trên hộp Dev nhúng của tôi.
Arthur Ulfeldt

3
Có cách nào dễ dàng để hiển thị “kích thước biểu kiến” ở định dạng con người có thể đọc được không? Khi sử dụng du -shb(theo gợi ý của câu trả lời này), -bcài đặt dường như ghi đè -hcài đặt.
Mathias Bynens

6
@MathiasBynens Đảo ngược thứ tự của các cờ (tức là du -sbh <dir>). Làm việc cho tôi.
Luis E.

2
@MathiasBynensdu -sh --apparent-size /dir/
Jongosi

2
@Arkady Tôi đã thử giải pháp của bạn trên CentOS và Ubuntu và có một lỗi nhỏ. Bạn muốn "du -sbh". Cờ "-h" phải đứng cuối cùng.
theJollySin

46

Sử dụng du -sb:

du -sb DIR

Theo tùy chọn, hãy thêm htùy chọn để có đầu ra thân thiện hơn với người dùng:

du -sbh DIR

4
-b có vẻ là một lựa chọn bất hợp pháp cho hệ điều hành MacOS' du
lynxoid

3
@lynxoid: Bạn có thể cài đặt phiên bản GNU với brew: brew install coreutils. Nó sẽ có sẵn dưới dạng lệnh gdu.
neu242

1
Không hoạt động. ls-> file.gz hardlink-to-file.gz. stat -c %s file.gz-> 9657212. stat -c %s hardlink-to-file.gz-> 9657212. du -sb-> 9661308. Nó chắc chắn không phải là tổng kích thước của nội dung mà là kích thước mà thư mục chiếm trên đĩa.
anton_rh,

24

cd vào thư mục, sau đó:

du -sh

ftw!

Ban đầu đã viết về nó ở đây: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/


1
Điều này là đơn giản và hoạt động! Cảm ơn. Đôi khi, tôi muốn thêm -Ltùy chọn dutheo sau các liên kết tượng trưng.
conradkleinespel,

2
hoạt động cho tôi (trên OS X)
sam boosalis

2
Điều này là đơn giản và không hoạt động. Nó in không gian mà thư mục chiếm trên đĩa, không phải tổng kích thước của nội dung có thể được tính bằng cách mở từng tệp và đếm byte.
anton_rh

17

Chỉ là một sự thay thế:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' sẽ loại trừ các thư mục.


4
Hoàn hảo, cũng thêm param -a để có được "các tập tin ẩn" (bất cứ điều gì bắt đầu với một khoảng thời gian)
Nicholi

Được tách biệt với một loại tệp cụ thể (trong trường hợp này là PNG) và được thể hiện bằng MB để dễ đọc hơn: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice

Đó là một câu trả lời chính xác. Không giống như dugiải pháp này thực sự đếm tổng kích thước của tất cả dữ liệu trong các tệp như thể chúng được mở từng cái một và các byte của chúng được tính. Nhưng có, việc thêm -Atham số là bắt buộc để đếm các tệp ẩn.
anton_rh 24/09/2018

13

định dạng "% s" của stat cung cấp cho bạn số byte thực tế trong một tệp.

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

Hãy thay thế phương pháp yêu thích của bạn để tính tổng các số .


4
Tốt hơn là sử dụng "find. -Type f -print0 | xargs -0 ..." để tránh các vấn đề với một số tên tệp nhất định (chứa khoảng trắng, v.v.).
hlovdal

1
vâng, điểm tốt. nếu nó không phải là trong bsd 4.2 Tôi không nhớ để sử dụng nó :-(
Nelson

3
find -print0xargs -0cần thiết cho các tên tệp có khoảng trắng. OS X muốn stat -f %z.
Kornel

1
(Lưu ý rằng công trình stat với các tập tin thưa thớt, báo cáo kích thước danh nghĩa lớn của tập tin và không phải là khối nhỏ hơn sử dụng trên đĩa như ducác báo cáo.)
Nelson

1
Không giống như nhiều câu trả lời khác ở đây sử dụng sai dutiện ích, câu trả lời này đúng. Câu trả lời ở đây rất giống: unix.stackexchange.com/a/471061/152606 . Nhưng tôi sẽ sử dụng ! -type dthay vì -type fđể đếm các liên kết tượng trưng (kích thước của chính liên kết tượng trưng (thường là vài byte), không phải kích thước của tệp mà nó trỏ đến).
anton_rh

3

Nếu bạn sử dụng "du" của busybox trong hệ thống emebedded, bạn không thể nhận được byte chính xác với du, chỉ có Kbyte bạn mới có thể nhận được.

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)

3

Khi một thư mục được tạo, nhiều hệ thống tệp Linux phân bổ 4096 byte để lưu trữ một số siêu dữ liệu về chính thư mục đó. Không gian này được tăng lên bội số 4096 byte khi thư mục phát triển.

lệnh du (có hoặc không có tùy chọn -b) tính không gian này , như bạn có thể thấy khi nhập:

mkdir test && du -b test

bạn sẽ có kết quả là 4096 byte cho một dir trống. Vì vậy, nếu bạn đặt 2 tệp 10000 byte bên trong dir, tổng số lượng được cung cấp bởi du -sb sẽ là 24096 byte.

Nếu bạn đọc kỹ câu hỏi, đây không phải là những gì được hỏi. Người hỏi hỏi:

tổng của tất cả dữ liệu trong tệp và thư mục con mà tôi sẽ nhận được nếu tôi mở từng tệp và đếm số byte

trong ví dụ trên phải là 20000 byte, không phải 24096.

Vì vậy, câu trả lời đúng IMHO có thể là sự pha trộn giữa câu trả lời Nelson và gợi ý hlovdal để xử lý các tên tệp chứa khoảng trắng:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'

2

Có ít nhất ba cách để lấy "tổng của tất cả dữ liệu trong tệp và thư mục con" theo byte hoạt động trong cả Linux / Unix và Git Bash dành cho Windows, được liệt kê bên dưới theo thứ tự trung bình từ nhanh nhất đến chậm nhất. Để bạn tham khảo, chúng được thực thi ở gốc của hệ thống tệp khá sâu ( docroottrong bản cài đặt Magento 2 Enterprise bao gồm 71.158 tệp trong 30.027 thư mục).

1.

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2.

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

3.

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


Hai thứ này cũng hoạt động, nhưng chúng dựa trên các lệnh không tồn tại trên Git Bash dành cho Windows:

1.

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2.

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


Nếu bạn chỉ muốn tổng số cho thư mục hiện tại, thì hãy thêm -maxdepth 1vào find.


Lưu ý rằng một số giải pháp được đề xuất không trả lại kết quả chính xác, vì vậy tôi sẽ gắn bó với các giải pháp ở trên.

$ du -sbh
832M    .

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133

1
Về Git Bash cho Windows, - trong trường hợp của Cygwin, dclà một phần của bcgói, vì vậy để có đượcdc nó cần phải cài đặt bc.
ruvim

1

Đối với Win32 DOS, bạn có thể:

c:> dir / sc: \ directory \ you \ want

và dòng áp chót sẽ cho bạn biết tệp đó chiếm bao nhiêu byte.

Tôi biết điều này đọc tất cả các tệp và thư mục, nhưng hoạt động nhanh hơn trong một số trường hợp.


1

durất tiện dụng, nhưng findhữu ích trong trường hợp nếu bạn chỉ muốn tính kích thước của một số tệp (ví dụ: sử dụng bộ lọc theo phần mở rộng). Cũng lưu ý rằng findchúng có thể in kích thước của mỗi tệp theo byte. Để tính tổng kích thước, chúng ta có thể kết nối dclệnh theo cách sau:

find . -type f -printf "%s + " | dc -e0 -f- -ep

Ở đây findtạo chuỗi lệnh cho dclike 123 + 456 + 11 +. Mặc dù, chương trình đã hoàn thành sẽ như thế nào 0 123 + 456 + 11 + p(hãy nhớ ký hiệu hậu tố).

Vì vậy, để có được chương trình hoàn thành, chúng ta cần đặt 0trên ngăn xếp trước khi thực hiện chuỗi từ stdin, và in số trên cùng sau khi thực hiện ( plệnh ở cuối). Chúng tôi đạt được điều đó thông qua dccác tùy chọn:

  1. -e0chỉ là phím tắt để -e '0'đặt 0trên ngăn xếp,
  2. -f-là để đọc và thực thi các lệnh từ stdin (được tạo bởi findđây),
  3. -eplà để in kết quả ( -e 'p').

Để in kích thước trong MiB như 284.06 MiBchúng ta có thể sử dụng -e '2 k 1024 / 1024 / n [ MiB] p'ở điểm 3 (hầu hết các khoảng trắng là tùy chọn).


1

Điều này có thể giúp:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

Lệnh trên sẽ tính tổng tất cả các tệp có kích thước thư mục.


1
Lưu ý rằng giải pháp này rất giống với câu trả lời của Barun. Nhưng giải pháp này không tính tổng các tệp trong thư mục con.
ruvim

1
@ruvim, nó cũng không tính tổng các tệp ẩn. Để tổng hợp các tệp ẩn, -Atùy chọn phải được thêm vào ls.
anton_rh,

0

Sử dụng:

$ du -ckx <DIR> | grep total | awk '{print $1}'

Trong đó <DIR> là thư mục bạn muốn kiểm tra.

'-C' cung cấp cho bạn tổng dữ liệu lớn được trích xuất bằng cách sử dụng phần 'tổng cộng grep' của lệnh và số lượng tính bằng Kbyte được trích xuất bằng lệnh awk.

Cảnh báo duy nhất ở đây là nếu bạn có một thư mục con chứa văn bản "tổng" thì nó cũng sẽ bị loại bỏ.

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.