我想知道某个目录下文件大小的分布。
请注意:文件大小的分布, 不是目录的大小。这意味着我想知道有 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
或者,可以进一步修改代码以接受多个目录作为参数,并为其搜索的每个目录分叉一个进程。
我假设您希望当前目录中的文件仅一层深(无递归)。