Unix查找平均文件大小

39

我有一个文件夹,里面有很多文件。我想找到这些文件的平均文件大小,因此需要执行类似于 ls somethinghere 这样的命令,以找出符合条件的所有文件的平均文件大小。


1
可能与这个问题有关(解决方案可能是将ls的输出导入到awk中进行平均):https://dev59.com/ukzSa4cB1Zd3GeqPnHwu - DNA
1
“code” ls -l “code” 并没有真正计算任何总数或平均数。 - Tony
8个回答

54

3
应该可以用,你试过了吗?如果出现“no gawk”的情况,请改为“awk”。祝好运。 - shellter
它似乎没有做任何事情,只是跳到了下一行。 - Tony
5
@Ernstsson,这个答案非常错误。如果当前目录中有任何目录,答案将显着偏离。此外,你是否阅读了之前链接中关于"off-by-one"的问题?应该使用 n-1 - Asclepius
请确保了解您的单位。在Ubuntu上,对我而言,打印的文件大小以kB为单位。像4.15049e + 06这样的数字大约为5MB。可能有一种设置可以固定给定命令的单位? - whiletrue
1
为什么不解析 ls 命令? - Cyrus
显示剩余5条评论

42

这是Ernstsson答案的简短、通用且适合递归的变体:

find ./ -ls | awk '{sum += $7; n++;} END {print sum/n;}'

或者,比如说,如果您想阻止大小超过100 KB的文件影响平均值:
find ./ -size -100000c -ls | awk '{sum += $7; n++;} END {print sum/n;}'

@A-B-B "对当前目录和子目录的干扰感到困惑。" - 你是不是想说在大小计算中包括了目录?这是有意为之的 - 我编写这个脚本的目的是为了找出小文件(以及目录)的平均文件大小,以确定mfs的合适块或片段大小(否则,你可以使用find-type f选项)。因此,这里有一个-size的例子,仅考虑几个大文件。你对我的评分不公正,并且你抱怨我没有测试过这个程序,这样做很无礼,特别是因为答案没有任何问题。 - cnst
2
你使用它的原因很有趣,但并不相关。如果我想要平均文件大小(正如原始问题中所述),我大概不希望目录影响这个数字,简而言之!至于 -1,它不仅适用于你;领先的答案也是这样。 - Asclepius
2
@A-B-B,目录只是一个文件,它占用文件系统上的空间,就像常规文件一样;问题从未指定只计算常规文件,因此省略它们是荒谬的;我希望您喜欢给那些明显回答问题的答案打-1! - cnst
即使考虑了你的论点,将当前目录包含在分析中仍然是有问题的。此外,你本可以在回答中加入一条注释,说明包括curdir在内的目录都会被纳入分析。但你没有这样做,并且在回答中也没有提到如何防止这种情况发生。 - Asclepius
3
我确定你是想说 "skewing" 而不是 "stewing"。 - Willem van Ketwich
显示剩余4条评论

6
使用wc -c *命令获取所有文件的大小,使用ls | wc -l命令获取文件数量,然后将两者相除即可。

不好意思,我正在寻找Ernstsson建议的一个命令,但是Cygwin似乎不喜欢那个语法 :( - Tony

4

这个功能具有可移植性,即使在AIX上也可以使用。 输出指定目录(${directory} 在下面的示例中)普通文件的平均字节数:

find "${directory}" '!' -path "${directory}" -prune -type f -ls | awk '{s+=$7} END {printf "%.0f\n", s/NR}'

无需手动计算文件数量。awk内置的NR参数可用于计算行数。 '!'-path ${directory} -prune 是一种通用的方式,通过剪枝掉非起始路径的任何路径来达到等同于GNU find命令中的-maxdepth 1的效果,从而忽略所有子目录。
根据文件类型调整限制。例如,要计算当前目录中除了*.sh以外的所有文件的平均值,可以添加 '!'-name '*.sh'
find . '!' -path . -prune -type f '!' -name '*.sh' -ls | awk '{s+=$7} END {printf "%.0f\n", s/NR}'

或者仅计算*.mp3文件并包括所有子目录(删除'!' -path . -prune):
find . -type f -name '*.mp3' -ls | awk '{s+=$7} END {printf "%.0f\n", s/NR}'

这个答案是错误的,因为它没有考虑目录的大小。就文件系统而言,目录只是普通文件。我的答案是可移植的,并且不会受到这些缺点的影响,因此,在尝试查找文件的平均大小以优化文件系统块大小时,它更加合适。 - cnst
2
嗯,这个问题询问的是平均文件大小,大多数人通常区分常规文件(类型f)和其他文件,例如目录,这就是为什么我认为这个答案对大多数情况都有用,并且在正常情况下不会出错,因此在这个答案中有意地排除了目录、套接字、符号链接等。 - MattBianco

3

du -sh . # 返回目录使用的总空间

find . -type f | wc -l # 统计文件数量

将第一个除以第二个即可。 如果你想要一行命令,可以这样写:

echo $(( `du -sb | tr '.' ' '` / `find . -type f | wc -l` ))

请注意,这里使用了du的“-b等同于'--apparent-size --block-size = 1'”参数。 - Xen2050

1
他们正在查找目录大小并查找计算机上存在的可用磁盘空间量。您需要使用的命令来查找目录大小是“du”。而要查找可用磁盘空间,可以使用“df”。本文中所有信息都在“du”和“df”的man页面中可用。如果你厌倦了阅读man页面,并想快速完成工作,那么这篇文章就是为你准备的。

-

"du" - 查找目录的大小
$ du

在提示符处输入上述内容,可以给您提供当前目录中存在的目录列表及其大小。输出的最后一行给出了包括子目录在内的当前目录的总大小。所给出的大小包括当前目录中存在的文件和目录以及所有子目录的大小。请注意,默认情况下所给大小以千字节为单位。
**$ du /home/david**

上述命令会给出目录 /home/david 的大小。
**$ du -h**

这个命令比默认的输出结果更好。选项“-h”代表着人类可读格式,所以文件/目录的大小会被标注为带有“k”表示千字节,“M”表示兆字节,“G”表示吉字节。
**$ du -ah**

这个命令将在输出中显示当前目录中的所有目录和文件。请注意,'du' 命令在提供最终大小的最后一行时始终计算所有文件和目录。但 '-a' 将文件名连同目录名一起显示在输出中。'-h' 是人类可读格式。
**$ du -c**

这将在输出的最后一行给出一个总计。因此,如果您的目录占用30MB,则输出的最后2行将是:

30M 。 30M 总计

第一行将是“du”输出的默认最后一行,指示目录的总大小,另一行显示相同的大小,后跟字符串“总计”。如果您使用grep命令将此命令与其他命令一起使用,则可以仅显示目录的最终总大小,如下所示。

**$ du -ch | grep total**

这将只有一行输出,显示当前目录及其所有子目录的总大小。
注意:如果您不熟悉管道(使上述命令成为可能),请参考文章24。同时,grep是Unix中最重要的命令之一。请参考文章25了解更多关于grep的信息。
**$ du -s**

这显示目录大小的摘要。这是了解当前目录总大小的最简单方法。
**$ du -S**

这将显示当前目录的大小,不包括该目录中存在的子目录的大小。因此,它基本上显示了当前目录中存在的所有文件的总大小。
**$ du --exculde=mp3**

上述命令将显示当前目录及其所有子目录的大小,但会排除所有文件名中包含给定模式的文件。因此,在上述情况下,如果当前目录或任何子目录中存在任何mp3文件,则它们的大小不会被计算在内,以计算总目录大小。
“df” - 查找磁盘可用空间/磁盘使用情况
键入以上内容,输出一个由6列组成的表格。所有列都很容易理解。请记住,“大小”,“已用”和“可用”列使用千字节作为单位。 “使用%”列显示用法百分比,这也非常有用。
**$ df -h**

显示与先前命令相同的输出,但“-h”表示以人类可读格式显示。因此,输出将具有“M”表示兆字节和“G”表示千兆字节,而不是以千字节为单位。

大多数用户不使用可以传递给“df”的其他参数。因此,我将不讨论它们。

我将反过来向您展示我在我的计算机上使用的示例。我实际上已将其存储为名为“usage”的脚本,因为我经常使用它。

例如:

我的Linux安装在/dev/hda1上,我也挂载了Windows分区(每次Linux启动时默认)。因此,“df”默认显示我Linux和Windows分区的磁盘使用情况。而我只对Linux分区的磁盘使用情况感兴趣。这就是我使用的内容:

**$ df -h | grep /dev/hda1 | cut -c 41-43**

这个命令会在我的机器上显示以下内容:

45%

基本上,此命令使 'df' 显示所有分区的磁盘使用情况,然后提取带有 /dev/hda1 的行,因为我只对此感兴趣。然后剪切第41到43列中的字符,因为它们是显示使用率的列,这正是我想要的。

还有一些可以与 'du' 和 'df' 一起使用的选项。您可以在 man 手册中找到它们。


0

除了 @cnst 以外,

如果您需要从计算中排除文件夹,请使用

find ./ -size +4096c -ls | awk '{sum += $7; n++;} END {print sum/n;}'


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Bracken

-2
使用du命令来估算给定目录的文件空间使用情况
du -sh /Your/Path # Average file size in human readable format

-s (--summarize) 仅显示每个参数的总计。

-h (--human-readable) 以人类可读的格式打印大小(例如 1K234M2G)。

请注意,不使用 -h 将给出默认块大小(512字节块)。

如果您希望指定块大小,可以使用 -k (千字节)-m (兆字节)-g (千兆字节)

du -sk /Your/Path # Average file size in Kilobytes.

注:使用文件路径将会给出指定文件的大小。


2
我可能错了,但是 du -sh 显示的是目录内容的总大小,而不是目录中文件的平均大小。 - Dave
这并没有回答问题。 - Hashim Aziz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接