Linux 平均文件大小,特定文件类型

Linux 平均文件大小,特定文件类型

我有一个目录,里面有很多不同的文件。是否可以计算特定文件类型(在我的情况下是 *.txt)的平均大小?我想对当前目录和子文件夹中的所有 *.txt 执行此操作。

答案1

您可以使用它stat -c%s *filename*来获取每个文件的大小,并且ls -l *.txt | wc -lls如果目录中没有 *.txt 文件,则会出现错误)获取当前目录中的 .txt 文件的数量。

Bash,AFIK,不支持浮点运算,因此您需要使用其他程序来计算平均大小。我建议使用bc

以下脚本将打印当前目录中所有 *.txt 文件的平均大小

#!/bin/bash

tsize=0
fcount=`ls -l *.txt | wc -l`

for f in *.txt
do
    fsize=`stat -c%s $f`
    tsize=`expr $tsize + $fsize`
done
average=`echo "$tsize / $fcount" | bc -l`
echo "Average size: $average"

ls请注意,如果当前目录中没有 .txt 文件,您将收到错误。

答案2

使用du可以生成列出的所有文件总数的命令:

echo $(( $(du -sbc *.txt | tail -1 | cut -f 1) / $(ls *.txt | wc -l) ))

使用-k-m代替-b其他测量单位。

答案3

提出一种替代方案,对于带有特殊字符的文件名,该方案的风险较小,处理ls输出可能会产生不良结果,并且对多个命令的管道较少,如果文件数量很大,则可能需要很长时间。

find ./ -type f -name '*.txt' -printf '%s\n' | \
  awk '{size+=$0}
       END {if (NR==0) {printf "No files found!\n";exit;}; 
            printf "# files: %u - Average size: %.3f KB\n", 
            NR, size/NR/1024}'

该解决方案利用Linux 查找*.txt在当前文件夹和子文件夹中搜索所需文件,并使用其printf '%s\n'选项打印文件大小(以字节为单位),后跟换行符。注意链接,并决定是否将它们包括在计算中,从而相应地调整“查找”表达式。

find 打印的每个文件大小都通过管道传输到awk大小总和中,最后它会将总和除以文件数,再除以 1024(将字节转换为千字节)。此外,还会检查是否未找到文件,以避免除以零。

对于仅输出平均大小(以字节为单位)的简短版本:

find ./ -type f -name '*.txt' -printf '%s\n' | awk '{size+=$0} END {if (NR>0) printf "%.0f\n",size/NR}'

相关内容