文件列表的文件大小总和

文件列表的文件大小总和

我有一个文本文件,其中包含文件名列表(每行一个文件名)。

现在我想计算所有这些文件的大小。我想我必须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, bashor之类的 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;}'

相关内容