2009-03-01 34 views
51

Tôi đang cố gắng tính tổng kích thước bằng byte của tất cả các tệp (trong cây thư mục) khớp với mẫu tên tệp chỉ bằng cách sử dụng trình bao. Đây là những gì tôi có cho đến thời điểm này:Tính kích thước tệp trong vỏ

find -name * .undo -exec stat -c% s {} \; | awk '{total + = $ 1} END {print total}'

Có cách nào dễ hơn để thực hiện việc này không? Tôi cảm thấy như có một công việc đơn giản hoặc tìm thấy công tắc mà làm điều này cho tôi nhưng tôi không thể tìm thấy một.

Để được rõ ràng tôi muốn tổng file phù hợp với một mô hình bất cứ nơi nào trong một cây thư mục có nghĩa

du -bs * .undo

sẽ không làm việc bởi vì nó chỉ phù hợp với các tập tin trong thư mục hiện tại.

+0

Dù sao, 'du' (hoặc' ls') sẽ không hoạt động trên vài nghìn tệp (lỗi "Danh sách đối số quá dài"). –

Trả lời

94

Hãy thử:

find . -name "*.undo" -ls | awk '{total += $7} END {print total}' 

Trên hệ thống của tôi kích thước của tập tin là lĩnh vực thứ bảy trong find -ls đầu ra. Nếu đầu ra find … -ls của bạn khác, hãy điều chỉnh.

Trong phiên bản này, sử dụng thông tin thư mục hiện có (kích thước tệp) và tính năng tìm kiếm tích hợp của tìm kiếm phải hiệu quả, tránh tạo quá trình hoặc tệp i/o.

+2

Điều đó sẽ có tác dụng, nhưng tùy chọn -ls để tìm và awk là quá mức cần thiết cho tác vụ này. –

+9

nope không overkill ở tất cả. – vladr

+4

Tôi sẽ thêm "-type f" vào lệnh tìm để tránh tổng số không chính xác nếu có thư mục khớp với "* .undo" glob. –

-3

Kiểm tra lệnh du (sử dụng đĩa).

18
du -c *pattern* 

Thao tác này sẽ in tổng trên dòng đầu ra cuối cùng.

+1

Và sử dụng đuôi để cắt bỏ tất cả trừ dòng cuối cùng. +1. =] – strager

+6

Điều đó sẽ chỉ tìm các tệp phù hợp với mẫu trong thư mục hiện tại - phải không? –

+0

Bạn có thể sử dụng mẫu như '*/*. Undo' ... mặc dù điều đó sẽ chỉ tìm các tệp có đuôi mở rộng là một thư mục sâu ... cũng sẽ không tìm thấy bất kỳ thư mục nào trong thư mục hiện tại. – Kasapo

8
find -name '*.undo' -exec wc -c {} + | tail -n 1 

nên cung cấp tổng số byte thực trong tệp, nếu bạn không có quá nhiều tệp (trong đó "quá nhiều" sẽ là số thực sự lớn, có thể là hàng nghìn). Hoặc nếu bạn chỉ muốn lấy số đơn lẻ,

find -name '*.undo' -exec wc -c {} + | tail -n 1 | cut -d' ' -f 1 
+0

Bạn nên báo giá '* .undo', "* .undo", \ *. Hoàn tác hoặc tương tự; nếu không, bạn sẽ nhận được kết quả sai nếu có tệp a.undo trong thư mục hiện tại. – ephemient

5

Python là một phần của hầu hết các bản phân phối Linux.

import os 
import fnmatch 
size= 0 
for path, dirs, files in os.walk('.'): 
    for f in files: 
     if fnmatch.fnmatch(f,'*.py'): 
      fileSize= os.path.getsize(os.path.join(path,f)) 
      print f, fileSize 
      size += fileSize 
print size 

Lâu dài, nhưng hoàn toàn rõ ràng và có khả năng mở rộng cao.

35

Với zsh, bạn có thể sử dụng mở rộng globbing làm:.

du -c **/* undo

+4

Và cá và Bash 4.0 quá – ephemient

+5

Và' du -ch **/*. undo' để có kích thước tệp có thể đọc được ... – student

22
find -name *.undo -print0 | du -hc --files0-from=- 
+0

Danh sách này Tất cả các tập tin Có cách nào để chỉ hiển thị tổng số không? Bất kể, tôi nghĩ đây là một ứng cử viên 'câu trả lời chính xác' –

+3

Tôi thích điều này bởi vì nó cho thấy kích thước 'con người có thể đọc được' @Tyler Collier chỉ hiển thị tổng số sử dụng đuôi: 'find-type f -name '* .undo' -print0 | du -hc --files0-from = - | tail -n 1' –

+0

Đây là câu trả lời hay nhất mà tôi từng thấy khi thực hiện việc này trên linux ... i ts cũng thực thi nhanh gấp 1.000 lần so với bất kỳ câu trả lời nào khác mà tôi đã thấy, vì tệp trên thực thi quá nhanh, cộng với nó cho đầu ra theo các từ có thể đọc được của con người – Myforwik

3
find -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1 

Đặt nhau từ gerdemb 's và đóng góp strager của. Sử dụng du -cb sẽ hiển thị byte.

9

Tôi cũng đã xem xét vấn đề này (chỉ một năm sau ...) - chỉ tìm thấy trang này.

Cái gì mà tôi thấy công trình (đối với tôi) như sau:

find /mnt/iso -name *.avi -printf "%s\n" | paste -sd+ - | bc 

này sẽ trở lại với tổng kích thước của tất cả các file .avi trong tất cả các thư mục con bên dưới/mnt/iso

tôi phải cung cấp tín dụng để radoulov cho lệnh dán - xem trang này: Shell command to sum integers, one per line?

chỉ cần thêm - chỉ trong trường hợp một thư mục phù hợp với từ khóa tìm kiếm - đó là một ý tưởng tốt để sử dụng -type f trong lệnh find quá.

0

Cách đơn giản này.

find ./ -name *.undo | xargs wc 
2

tôi sử dụng lệnh du như thế này để có được số lượng chỉ:

du file_list | awk '{s+=$1} END {print s}' 
0

Hoặc, bạn chỉ có thể làm điều này:

dir=$1 

for file in $dir/* ; do 

length_file=`stat -c %s $file` 
echo "File $file has length $length_file" 
length_total=`expr $length_total + $length_file` 

done 

echo "Total length: $length_total ." 

đâu stat sẽ hiển thị một tập tin hoặc hệ thống tập tin tình trạng . Đối số -c có nghĩa là sử dụng định dạng được chỉ định thay vì định dạng mặc định và chuỗi định dạng $ s cho phép hiển thị tổng kích thước của byte.

expr 

Chỉ cần đánh giá biểu thức.

0

Perl one-liner:

find . -name "*.undo" -ls | perl -lane '$t += $F[6]; END{print $t}' 

Mảng @F autosplit giá khởi điểm chỉ số $F[0] trong khi lĩnh vực awk bắt đầu với $ 1, do đó $F[6] được sử dụng thay cho awk của $7

0

du -c | awk '/./{line=$0} END {print $ 1}'

0

Tôi nghĩ rằng phiên bản có xarg có thể bị im lặng (đơn giản) ls -1 * .undo | xargs wc

Các vấn đề liên quan