文件列表的文件大小总和

Tob*_*ann 5 bash awk files

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

现在我想计算所有这些文件的大小。我想我必须对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,如果对于符号链接,您宁愿计算符号链接最终解析为的文件的大小。

它假定像一个贝壳kshbashzsh$(<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)


Cos*_*tas 8

你只需要最后一行du -c输出

du -ch $(<list) | tail -1
Run Code Online (Sandbox Code Playgroud)


Sob*_*que 5

我会使用-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)

(以及“文件名列表”中的管道或像以前一样在其后指定文件参数)

  • 如果你想要不可读:`perl -nlE'$s+=-s$_}END{say$s'` (2认同)