Tính kích thước tập tin trung bình


11

Tôi đang tìm kiếm một lớp lót tiện dụng để tính toán kích thước tệp trung bình trong một thư mục.

Điều tôi muốn là:

kích thước của tất cả các tập tin / số lượng tập tin trong thư mục


Như trong kích thước trung bình của mỗi tập tin trong thư mục? hoặc kích thước của thư mục?
Drake Clarris

Kích thước trung bình của một tệp trong một thư mục
taffer

Câu trả lời:


3

Với FreeBSD / Mac OS X find, statawk(không hẳn là một tiện dụng one-liner dù):

find -x . -type f -maxdepth 1 -exec sh -c 'stat -f '%z' "${@}"' _ '{}' + | 
LC_ALL=C awk -v pwd="${PWD}" '
   BEGIN{ sum=0; count=0; }
   { sum+=$1; ++count; }
   END{ 
        if (count == 0) exit;
        printf ("number of files: %d\n", count); 
        printf ("average file size in B: %.5f\n", sum/count); 
        printf ("average file size in KB: %.5f\n", (sum/count) / 1024); 
        printf ("average file size in MB: %.5f\n", (sum/count) / (1024*1024)); 
        printf ("directory: %s\n", pwd); 
   }
'

Lưu ý rằng trong -v var=value, awksẽ mở rộng các chuỗi ANSI C như \n, \r... Trong khi các shell thực hiện xuất PWD, do đó bạn có thể sử dụng ENVIRON["PWD"]trong awkđó không có vấn đề như vậy đối với các thư mục có dấu gạch chéo ngược trong tên của chúng.
Stéphane Chazelas

Nếu bạn chỉ cần kích thước trung bình tính bằng byte, bạn có thể sử dụng find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
Lri

11

Với GNU tìm:

find . -type f -printf '%s\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s/NR}'

Hoặc để sử dụng đĩa:

find . -type f -printf '%k\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s*1024/NR}'

Lưu ý rằng nếu có một số liên kết cứng của cùng một tệp trong đó, điều đó sẽ tính việc sử dụng đĩa của nó nhiều lần.

Ở trên chỉ tính các tệp thông thường, không liên kết hoặc thư mục hoặc các tệp đặc biệt khác. Nó bao gồm các tập tin ẩn.

Tương tự với zshnội dung:

zmodload -i zsh/stat
count() {zstat -Hs -- $REPLY; ((size+=$s[size], count++, 0))}
size=0 count=0
**/*(oNDN.+count)
print -f "Count: %s\nAverage size: %.2f\n" $count $(($size./count))

3

Một giải pháp đơn giản trong một dòng:

ls -Rl -- "$DIR" | awk 'BEGIN{sum=0;count=0};/^-/{sum+=$5;++count};END{print sum/count}'

Nó có một cú pháp cú pháp trong đó, chỉ xem xét lscác dòng đầu ra bắt đầu bằng '-', nên tạo thành dữ liệu cho các tệp thông thường.


2

chỉ các tệp trong một thư mục, bỏ qua các thư mục con:

expr $(du -Ss | cut -f1) / $(find /path/to/dir -maxdepth 1 -type f | wc -l)

Hoặc để đếm tất cả các tệp bao gồm các tệp trong thư mục con:

expr $(du -s | cut -f1) / $(find /path/to/dir -type f | wc -l)

Tôi muốn không bỏ qua các thư mục phụ.
taffer

đẹp. Chỉ cần thêm -k vào du invocation để có kết quả là 1024byte (kb) thay vì 512byte (kích thước mặc định của một đoạn tệp).
Olivier Dulac

2
du -ssẽ thêm việc sử dụng đĩa (không phải kích thước) của tất cả các tệp và thư mục và các tệp không thường xuyên khác , ngoại trừ các liên kết cứng bổ sung vào cùng một tệp, trong khi findsẽ đếm tất cả các tệp thông thường. Ngoài ra, tên tệp với các ký tự dòng mới sẽ được tính nhiều lần. du -Slà GNU cụ thể. du -ssẽ báo cáo các ngành hoặc kilobyte tùy thuộc vào hệ điều hành.
Stéphane Chazelas

Như thường lệ @StephaneChazelas kiến ​​thức về linux / unix của tôi làm tôi kinh ngạc và cho tôi thấy các giải pháp nhanh và bẩn của tôi bẩn đến mức nào. Bạn đã sử dụng linux / unix bao lâu rồi?
Drake Clarris

Trả lời là sai lầm khủng khiếp và nên được xóa. Giải thích bởi Stephane.
Acumenus
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.