我有一个目录,里面有很多不同的文件。是否可以计算特定文件类型(在我的情况下是 *.txt)的平均大小?我想对当前目录和子文件夹中的所有 *.txt 执行此操作。
答案1
您可以使用它stat -c%s *filename*
来获取每个文件的大小,并且ls -l *.txt | wc -l
(ls
如果目录中没有 *.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}'