Có cách nào để tổng hợp kích thước của các tập tin được liệt kê?


20

Đây là lệnh tôi đang sử dụng để liệt kê một số tệp:

find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \;
-rw-r--r--   1 qa1wrk15   test       1265190 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_7.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1345554 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_2.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1370532 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_3.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1399854 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_8.20110929.extract.sys

vân vân

Bây giờ tôi muốn tính tổng kích thước của các tệp này bằng cách tóm tắt cột thứ 5. Tôi đã nghĩ đến việc sử dụng awk, để làm điều này vì vậy tôi đã thử nghiệm những điều sau đây trong một thư mục cụ thể

>ls -lrt | awk `{ print $1 }`
ksh: syntax error at line 1 : `{' unmatched

Tôi không hiểu vấn đề là gì, tại sao lỗi cú pháp này .

Tôi đang suy nghĩ để thử

ls -lrt | awk `BEGIN {total = 0} {for(i=0;i<NR;i++){total+=$5}} END {printf "%d",total} 

Điều này cũng có, nhưng một awkkịch bản đơn giản không hoạt động.

Vui lòng đề nghị hoặc sửa chữa cho tôi nếu tôi sai, hoặc nếu có một cách giải quyết cho việc này.

Câu trả lời:


26

Trước hết, bạn nên sử dụng dấu ngoặc đơn ( '), không phải là dấu nghiêng ( `).

Các awkkịch bản nội tuyến có thể là như sau:

ls -lrt | awk '{ total += $5 }; END { print total }'

vì vậy, không cần khởi tạo total( awkkhởi tạo nó về 0) và không cần lặp, awkđã thực thi tập lệnh trên mỗi dòng đầu vào.


1
Nói tóm lại, một tàu sẽ là: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
Helt


16

@enzotib đã chỉ ra lỗi cú pháp của bạn là gì - Tôi sẽ đi vào một chút tiếp tuyến.

Tổng hợp một cột số là một trong những điều liên tục xuất hiện. Tôi đã kết thúc với chức năng shell này:

sumcol() 
{ 
    awk "{sum+=\$$1} END {print sum}"
}

Với điều này, giải pháp của bạn trở thành:

ls -lrt | sumcol 5

Điều đó sẽ tổng hợp các số trong cột 5 và in giá trị.


Trong thực tế, tôi đã tự hỏi tại sao không có một tiện ích tiêu chuẩn cho điều đó.
enzotib

Đi ngay vào .aliasestập tin của tôi .
Konrad Rudolph

14

Đây là một cách khác để làm điều này bằng cách sử dụng du:

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'

1
Sử dụng tuyệt vời của du. Ví dụ tốt đẹp. Là một lợi ích bổ sung, bạn có thể thêm tùy chọn "-h" vào du để có được đầu ra trong Gig. Sau đó, bạn không phải đếm các chữ số và như vậy. Tôi vừa chạy thử nghiệm trên một loạt các tệp có kích thước khoảng 1188800 kbyte. Nó lớn cỡ nào Không vấn đề gì, du -ch --files0-from=-nói với tôi rằng tổng của tôi là "9.0G". Sweeeet!
Mike S

Ngọt ngào, tuyệt vời của du!
haridsv

Ngoài ra, nếu bạn chỉ quan tâm đến tổng số, thì đầu ra ống du tail -1.
haridsv

4

Trong trường hợp HP-UX findcũng có -printftùy chọn, sẽ rất hữu ích khi soạn công thức bctính toán:

( find . -name \*.extract.sys -size +1000000c -printf '%s+'; echo 0 ) | bc

Nếu công thức trở nên quá lớn, nó có thể được tính từng bước:

( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc

1

Với GNU find:

find -name '*.extract.sys' -size +1000000c -printf '%s\n' | jq -s add

Với GNU stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -c%s '{}' + | jq -s add

Với BSD stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add

jqmột tiện ích? Dường như không tìm thấy trên bản phân phối debian (Debian 4.9.51-1 (2017-09-28) x86_64 GNU / Linux)
Death Metal
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.