我有一个文本文件,其中包含文件名列表(每行一个文件名)。
现在我想计算所有这些文件的大小。我想我必须ls -la
对文件的每一行执行 a 操作,然后累积文件大小。
我认为这awk
将是解决方案的一部分,但这只是猜测。
答案1
您只需要最后一行du -c
输出
du -ch $(<list) | tail -1
答案2
使用 GNU stat
:
stat -c %s -- $(<list) | paste -d+ -s - | bc
stat
显示有关文件的信息-c
指定格式,%s
给出文件大小(以字节为单位)
paste -d+ -s
+
使用 a作为分隔符将输出逐行连接在一起bc
通过管道传输到bc
,它将一起计算。
添加一个-L
选项stat
,如果对于符号链接,您宁愿计算符号链接最终解析为的文件的大小。
假设有像ksh
, bash
or之类的 shell zsh
,并使用$(<file)
运算符对文件内容调用 split+glob。
这里list
预计是一个空格、制表符或换行符(假设默认值为$IFS
)分隔的文件模式列表(如 中*.txt /bin/*
)。对于文件路径列表(每行一个),您需要禁用通配符并仅限$IFS
换行符,或者使用 GNU xargs
:
xargs -rd '\n' -a list stat -c %s -- | paste -sd+ - | bc
答案3
我会用-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";
STDIN
(从命令行指定的文件读取文件名,例如myscript.pl file_list.txt
)
你可以“一行”这样:
perl -nle '$sum += -s $_; END { print $sum }'
(并且可以像以前一样在“文件名列表”中输入管道或在其后指定文件参数)
答案4
我也想出了一个解决方案:
cat files.txt | while read f; do ls -la $f; done | awk '{s+=$5;} END {print s;}'