如何获取文件大小的分布?

如何获取文件大小的分布?

我想知道某个目录下文件大小的分布。

请注意:文件大小的分布, 不是目录的大小。这意味着我想知道有 25 个 60 字节的文件,50 个 12587 字节的文件,2 个 57kbytes 的文件,依此类推。

如果可以通过命令行(例如在远程系统上)以易于生成图表的格式收集数据,那就加分了。

答案1

列出文件,从列表中提取大小(以字节为单位),对其进行排序并计算每个大小的出现次数:

find /my/directory -type f -exec ls -l {} + | cut -d' ' -f5 | sort -n | uniq -c
  • 效率不是很高
  • 如果有很多文件,最好将中间结果保存在临时文件中,将其排序到另一个临时文件,然后“uniq”它
  • 这里我使用数字排序,因此输出将按文件大小升序排序(很好),但只要将相等的行分组在一起,任何排序都可以
  • 通过管道将结果输入awk '{ print $1 "," $2 }'以获取要在您选择的绘图工具中使用的 CSV 文件(甚至电子表格工具也可以)

答案2

Luke404 的 GNU find 变体:

find . -type f -printf '%s\n' | sort -n | uniq -c

答案3

此 Perl 代码可能会有所帮助:

@files = grep {-f} glob "*"; #List files in the current directory   
%files;  
for(@files)  
{  
  chomp (my $size = \`du -h \"$_\"`);  
  $size=~ s/\s+.*//;  #Remove the file name from the output of du  
  $files{$size}++;  #  Add an entry to the hash  
}  
print "Size,Count\n"; # Print a header  
print "${\_},$files{$_}\n" for(keys %files); # Print info in CSV format  

请注意以下事项:

  • 此代码不会尝试按大小对文件进行排序(这可能需要一个子例程)
  • 我使用Perl 的运算符du而不是-s为了获得人类可读的输出。
  • 如果要列出当前目录以外的目录的内容,请替换glob "*"glob "$ARGV[0]/*"并将所需目录的名称作为命令行参数提供。
  • 如果您想在批处理作业中列出多个目录的内容,您可以将此代码另存为,list_dir.pl并使用 bash 包装器执行如下操作:

    list_dir.pl dir1 > dir1_list.csv  
    list_dir.pl dir2 > dir2_list.csv
    
  • 或者,可以进一步修改代码以接受多个目录作为参数,并为其搜索的每个目录分叉一个进程。

我假设您希望当前目录中的文件仅一层深(无递归)。

相关内容