Hiển thị tổng kích thước tệp trong danh sách thư mục


71

dirLệnh liệt kê thư mục Windows có một dòng ở cuối hiển thị tổng dung lượng được chiếm bởi các tệp được liệt kê. Ví dụ: dir *.exehiển thị tất cả các .exetệp trong thư mục hiện tại, kích thước của chúng và tổng cộng kích thước của chúng. Tôi rất thích có chức năng tương tự với dirbí danh của mình trong bash, nhưng tôi không chắc chắn chính xác làm thế nào để đi về nó.

Hiện nay, tôi có alias dir='ls -FaGl'trong tôi .bash_profile, cho thấy

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

ví dụ. Lấy câu trả lời từ câu hỏi này :

dir | awk '{ total += $4 }; END { print total }'

cung cấp cho tôi tổng số, nhưng không in danh sách thư mục chính nó. Có cách nào để thay đổi điều này thành tập lệnh một lớp hay shell để tôi có thể vượt qua bất kỳ lsđối số nào tôi muốn dirvà có được một danh sách đầy đủ cộng với tổng cộng không? Ví dụ: tôi muốn chạy dir -R *.jpg *.tifđể lấy danh sách và tổng kích thước của các loại tệp đó trong tất cả các thư mục con. Lý tưởng nhất, sẽ thật tuyệt nếu tôi có thể có được kích thước của mỗi thư mục con, nhưng điều này không cần thiết.


5
Tại sao không ls -lhgiúp bạn? Nó in tổng số tiền trong đầu. Bạn cũng có thể chạy du -sh *.exeđể lấy thông tin sử dụng không gian đĩa ở dạng người có thể đọc được.
bagavadhar

@ashwin Tôi không biết 'tổng số' ls -lhđang in là gì, nhưng nó không phải lúc nào cũng liên quan đến những gì các awktập lệnh bên dưới tính toán, hoặc những gì tôi thêm bằng tay. Đôi khi, nó gần bằng số KB tệp trong thư mục, nhưng dường như không có kích thước được phân bổ của các thư mục con có hiệu lực. Tôi sẽ biết ơn nếu bạn có thể chỉ cho tôi một lời giải thích về con số chính xác đó là gì ...
MattDMo

hãy xem câu trả lời của tôi dưới đây có hiệu quả với bạn không
bagavadhar

1
ls -lhkhông hiển thị tổng kích thước của một thư mục tính toán nội dung của nó
aequalsb

Câu trả lời:


25

Hàm sau đây thực hiện hầu hết những gì bạn yêu cầu:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

... nhưng nó sẽ không cung cấp cho bạn những gì bạn yêu cầu dir -R *.jpg *.tif, bởi vì đó không phải là cách ls -Rhoạt động. Bạn có thể muốn chơi xung quanh với các findtiện ích cho điều đó.


1
Điều này đúng, nếu bạn đang tìm kiếm về cơ bản kích thước nội dung của mỗi tệp, KHÔNG phải kích thước mà tệp tiêu thụ trên đĩa. Sự khác biệt này rõ rệt hơn đối với các tệp rất nhỏ. Trên bản phân phối của tôi, mỗi tệp được phân bổ không gian trên đĩa theo khối 4 KB (vì vậy tệp 300 byte vẫn sử dụng 4K trên đĩa, như được báo cáo bởi lệnh du). Cho rằng đó là những gì OP đang tìm kiếm "mỗi tệp chiếm bao nhiêu dung lượng", thì du là cách để làm điều đó.
Jon V

1
dirđã là tên của một lõi GNU phổ biến, tôi không muốn đặt tên một hàm như thế.
tráng miệng

Vui lòng sửa để nó hoạt động trên cả Linux và OS-S và "-a" bao gồm "." và "..", không tốt :) Đây là lệnh cố định: dir () {ls -FAl "$ {@}" | awk '{tổng + = $ 5; in}; END {in "tổng:" tổng} '; }
Dmitry Shevkoplyas

148

Đã có một lệnh UNIX cho việc này: du

Cứ làm đi:

du -ach 

Theo quy ước, bạn có thể thêm một hoặc nhiều đường dẫn tệp hoặc thư mục vào cuối lệnh. -hlà một tiện ích mở rộng để chuyển đổi kích thước thành định dạng thân thiện với con người, -acung cấp cho bạn kích thước "rõ ràng" (kích thước tệp thay vì sử dụng đĩa) và -cđưa ra tổng số ở cuối.


12
Vâng, du hoạt động tốt. Bạn có thể sử dụng tùy chọn -c (giống như --total) để lấy tổng số ở cuối danh sách.
MikeB

6
Lưu ý rằng ducung cấp cho việc sử dụng đĩa, không phải tổng kích thước tập tin.
Stéphane Chazelas

7
du -hkhông tổng hợp kích thước của các tập tin được truyền cho nó. du -h *.sohiển thị kích thước của mỗi tệp, nhưng không phải là tổng. Tôi nghĩ những gì bạn muốn ở đây là du -hc *.so(hoặc thậm chí du -hc *.so | tail -1). Nhưng tất nhiên, anh ấy cũng muốn danh sách thư mục.
Chuộc tội có giới hạn

1
Lệnh này chỉ hoạt động với danh sách ngắn các tập tin. Xem những gì xảy ra khi bạn có 850000 tệp trong một thư mục !!!
Hamid FzM

3
! -acó nghĩa là --all. Cân nhắc sử dụng--apparent-size
Arnauld VM

17

Bạn có thể dùng du -h -c directory|tail -1

Điều này sẽ tạo ra một dòng duy nhất với việc sử dụng bộ nhớ.


15
du -hs directorynếu bạn chỉ muốn tổng số.
Stéphane Chazelas

8

Chỉ cần in dòng hiện tại mà bạn đang tổng hợp:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'

6

với perl:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Kích thước của tất cả các tệp PDF không bị ẩn trong thư mục hiện tại.


1

Thêm phần sau vào .bash_profile hoặc .bashrc hoạt động với tôi.

dir ()
{
find . -iname "$@" -exec ls -lh {} \;
find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1;
}

Bây giờ khi tôi thực hiện một thư mục * .mp3, nó sẽ đệ quy và in tổng số ở cuối. Bạn có thể kiểm soát độ sâu bạn muốn bằng cách thêm tham số maxdepth vào tìm kiếm. Tôi biết chạy tìm hai lần không phải là một ý tưởng rất hiệu quả. Nhưng tôi không thể nghĩ ra một cách tốt hơn. Atleast nó được thực hiện công việc.


1

Sử dụng du và một tuyên bố awk như một đề cập ở trên sẽ cung cấp những gì bạn đang tìm kiếm.

Thí dụ: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

Điều này sẽ liệt kê tất cả các tệp trong thư mục Tải xuống của người dùng abc kết thúc bằng .jpg và in tổng của tất cả các tệp này ở cuối danh sách.


0

Để có được cả hai, đầu ra dir và tính toán kích thước, mà không cần sử dụng bất kỳ tùy chọn được đề xuất nào khác, bạn có thể sử dụng tee (1) và thay thế quy trình ...

dir | tee >( awk '{ total += $4 }; END { print total }' )

Không cần tee, chỉ cầndir | awk '{print; total += $4}; END {print total}'
Stéphane Chazelas

0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'

3
Không. Đầu tiên, chỉ đưa ra một lệnh không phải là một câu trả lời. Thứ hai, nếu bạn bận tâm đọc toàn bộ câu hỏi, các câu trả lời khác và nhận xét của tôi, bạn sẽ thấy đây KHÔNG phải là điều tôi muốn.
MattDMo

Để công bằng cho người đăng, đây là kết quả tìm kiếm đầu tiên cho tìm kiếm Google linux sum human readable sizesvà là thứ tôi đang tìm kiếm.
Sridhar Sarnobat

-2
du * | awk -v sum=0 '{print sum+=$1}' | tail -1

Điều này không làm những gì tôi yêu cầu.
MattDMo
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.