Cách chỉ hiển thị tổng kích thước tệp của phần mở rộng cụ thể bằng lệnh `du`


11

Tôi có hàng trăm tệp pdf và tệp html trong một thư mục. Và tôi muốn biết tổng kích thước của tập tin pdf.

Bằng lệnh du -ch /var/footôi có thể thấy tổng kích thước tệp nhưng tôi chỉ cần dòng cuối cùng, tổng kích thước.

Nếu thư mục chỉ chứa các tệp pdf tôi có thể sử dụng -stùy chọn, nhưng tùy chọn này không thể được sử dụng lần này.

Làm thế nào tôi có thể chỉ nhận được tổng kích thước của loại tệp cụ thể?


Bạn có thể sử dụng như thế du -sh /foo/*.pdfnào?
bagavadhar

2
du -ch /var/foo/*.pdf | tail -n 1
don_crissti

Câu trả lời:


10

Với GNU du(tức là trên Linux hoặc Cygwin không được nhúng), bạn có thể sử dụng --excludetùy chọn để loại trừ các tệp bạn không muốn khớp.

du -s --exclude='*.html' /var/foo

Nếu bạn muốn khớp *.pdfcác tệp một cách tích cực , bạn sẽ cần sử dụng một số phương pháp khác để liệt kê các tệp và duít nhất sẽ hiển thị một dòng đầu ra cho mỗi đối số, cộng với tổng cộng với tùy chọn -c. Bạn có thể gọi tailđể xóa tất cả trừ dòng cuối cùng hoặc sed để xóa từ. Để liệt kê các tệp trong một thư mục đó, hãy sử dụng các ký tự đại diện trong trình bao.

du -sc /var/foo/*.pdf | tail -n1
du -sc /var/foo/*.pdf | sed -n '$s/\t.*//p'

Nếu bạn cũng cần duyệt các tệp trong thư mục con, hãy sử dụng findhoặc sử dụng một **/mẫu nếu trình bao của bạn hỗ trợ điều đó. Đối với **/, trong bash, lần chạy đầu tiên shopt -s extglobvà lưu ý rằng các phiên bản bash lên đến 4.2 sẽ đi qua các liên kết tượng trưng đến các thư mục; trong zsh, điều này làm việc ra khỏi hộp.

du -sc /var/foo/**/*.pdf | tail -n1

Một điều phức tạp nữa với phiên bản find là nếu có quá nhiều tệp, findsẽ chạy dunhiều lần, để giữ dưới giới hạn độ dài dòng lệnh. Với phương thức ký tự đại diện, bạn sẽ gặp lỗi nếu điều đó xảy ra (vượt quá giới hạn độ dài dòng lệnh của Mt. Đoạn mã sau giả định rằng bạn không có bất kỳ tên tệp phù hợp nào chứa dòng mới.

find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'

(có lẽ không phải là vấn đề trong thực tế nhưng lưu ý rằng --exclude='*.html'sẽ /var/foo/dir.html/foo.pdfkhông được tính là loại trừ cũng ảnh hưởng đến việc truyền tải thư mục; đồng thời, việc sử dụng đĩa của các thư mục bao gồm /var/foochính nó sẽ được tính đến)
Stéphane Chazelas

3

Bạn có thể để shell mở rộng các tập tin:

$ mkdir foo
$ echo "abc" > foo/1.pdf
$ echo "abcd" > foo/2.pdf
$ echo "abcd" > foo/3.html
$ du -ch foo/*.pdf
4,0K    foo/1.pdf
4,0K    foo/2.pdf
8,0K    total

Tuy nhiên, như bạn có thể thấy điều này ấn định tập tin khoảng 1000 lần như vừa tạo. Một tùy chọn tốt hơn là sử dụng -btùy chọn:

$ du -cbh foo/*.pdf
4   foo/1.pdf
5   foo/2.pdf
9   total

Kích thước tệp lớn vẫn sẽ được hiển thị ở dạng có thể đọc được của con người, vd 173K.


duhiển thị mức sử dụng đĩa của từng tệp (trên hầu hết các hệ thống tệp, đó là kích thước tệp được làm tròn lên bội số tiếp theo của kích thước khối). Với tùy chọn -b, duhiển thị kích thước của mỗi tệp.
Gilles 'SO- ngừng trở nên xấu xa'
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.