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
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
Câu trả lời:
Với FreeBSD / Mac OS X find
, stat
và awk
(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);
}
'
-v var=value
, awk
sẽ 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.
find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'
.
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 zsh
nộ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))
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 ls
cá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.
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)
du -s
sẽ 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 find
sẽ đế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 -S
là GNU cụ thể. du -s
sẽ báo cáo các ngành hoặc kilobyte tùy thuộc vào hệ điều hành.