linux - 按所有者在目录中汇总文件大小的最快方法
问题描述
我正在使用以下命令使用别名来按所有者在目录中打印所有文件大小的总和
ls -l $dir | awk ' NF>3 { file[$3]+=$5 } \
END { for( i in file) { ss=file[i]; \
if(ss >=1024*1024*1024 ) {size=ss/1024/1024/1024; unit="G"} else \
if(ss>=1024*1024) {size=ss/1024/1024; unit="M"} else {size=ss/1024; unit="K"}; \
format="%.2f%s"; res=sprintf(format,size,unit); \
printf "%-8s %12d\t%s\n",res,file[i],i }}' | sort -k2 -nr
但是,它似乎并不总是很快。
是否有可能以其他方式获得相同的输出,但速度更快?
解决方案
另一个 perl 显示按用户排序的总大小:
#!/usr/bin/perl
use warnings;
use strict;
use autodie;
use feature qw/say/;
use File::Spec;
use Fcntl qw/:mode/;
my $dir = shift;
my %users;
opendir(my $d, $dir);
while (my $file = readdir $d) {
my $filename = File::Spec->catfile($dir, $file);
my ($mode, $uid, $size) = (stat $filename)[2, 4, 7];
$users{$uid} += $size if S_ISREG($mode);
}
closedir $d;
my @sizes = sort { $a->[0] cmp $b->[0] }
map { [ getpwuid($_) // $_, $users{$_} ] } keys %users;
local $, = "\t";
say @$_ for @sizes;
推荐阅读
- r - 创建一个遍历页码的函数
- sql-server - I/O 在数据库 DBName 上被冻结。无需用户操作
- java - 检查正则表达式中是否有大于负数 -328 的整数
- c# - C# 错误“事务与当前连接没有关联或已完成”
- r - 返回不同大小数组列表中的最大元素数
- php - 如何在 WooCommerce 中在订单完成的电子邮件模板上添加新帐户信息
- c++ - 使用 C++ 将数据从我的 Qt 应用程序插入到 mySQL 数据库时出现问题
- c++ - 我怎样才能只允许在调用函数 B 之后才调用函数 A?
- c11 - 使用 wprintf 打印 UTF-32 字符串
- r - 为什么在使用过滤器时将 tibble 中的命名列表列转换为列表