我有一个包含文件名列表的文本文件(每行一个文件名)。
现在我想计算所有这些文件的大小。我想我必须对ls -la文件的每一行都做一个,然后累积文件大小。
我认为这awk将是解决方案的一部分,但这只是猜测。
cha*_*aos 11
使用 GNU stat:
stat -c %s -- $(<list) | paste -d+ -s - | bc
Run Code Online (Sandbox Code Playgroud)
stat 显示有关文件的信息
-c指定格式,%s以字节为单位给出文件大小paste -d+ -s使用+分隔符将输出逐行连接在一起bc通过管道传输到bc,它将一起计算。添加一个-L选项到stat,如果对于符号链接,您宁愿计算符号链接最终解析为的文件的大小。
它假定像一个贝壳ksh,bash或zsh与$(<file)经营者对文件的内容调用拆分+水珠。
这里list应该是空格、制表符或换行符(假设默认值为$IFS)分隔的文件模式列表(如*.txt /bin/*)。对于每行一个文件路径列表,您需要禁用通配符并$IFS仅限制为换行符,或使用 GNU xargs:
xargs -rd '\n' -a list stat -c %s -- | paste -sd+ - | bc
Run Code Online (Sandbox Code Playgroud)
我会使用-s文件测试和perl:
-s 文件具有非零大小(以字节为单位返回大小)。
像这样的东西:
#!/usr/bin/env perl;
use strict;
use warnings;
my $sum = 0;
while ( my $filename = <> ) {
chomp ( $filename );
$sum += -s $filename;
}
print "Sum is $sum bytes\n";
Run Code Online (Sandbox Code Playgroud)
(从STDIN或从命令行指定的文件读取文件名,例如myscript.pl file_list.txt)
你可以“一个班轮”这个:
perl -nle '$sum += -s $_; END { print $sum }'
Run Code Online (Sandbox Code Playgroud)
(以及“文件名列表”中的管道或像以前一样在其后指定文件参数)