ファイル名のリスト(1行に1つのファイル名)を含むテキストファイルがあります。
さて、これらすべてのファイルのサイズを計算したいと思います。ls -la
ファイルの各行に対して操作を実行してから、ファイルサイズを累積する必要があると思います。
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
+
区切り文字として出力を 1 行ずつ連結します。bc
にパイプするとbc
一緒に計算されます。
シンボリックリンクの場合、シンボリックリンクが最終的に確認されるファイルのサイズを計算する場合は、-L
オプションを追加してください。stat
ksh
、bash
orなどのシェルがあり、演算子をzsh
使用して$(<file)
ファイルの内容に対して分割+globを呼び出すとします。
これはlist
、スペース、タブ、または改行(デフォルトと仮定$IFS
)で区切られたファイルモードのリスト(のように*.txt /bin/*
)でなければなりません。ファイルパスのリスト(1行に1つずつ)を表示するには、ワイルドカードを無効にし、改行のみを制限するか、$IFS
GNUを使用する必要がありますxargs
。
xargs -rd '\n' -a list stat -c %s -- | paste -sd+ - | bc
答え3
私は使用します-s
ファイルテストとperl
:
-sファイルのサイズが0ではありません(サイズをバイト単位で返します)。
このような:
#!/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;}'