web-dev-qa-db-ja.com

ファイルリストを含むファイルから合計ファイルサイズを取得する

合計ファイルサイズを知りたいファイルのリストを含むファイルがあります。そうするためのコマンドはありますか?

私のOSは非常に基本的なLinux(Qnap TS-410)です。

編集:

ファイルの数行:

/ share/archive/Bailey Test/BD006/0.tga
/share/archive/Bailey/BD007/1バージョン1.tga
/share/archive/Bailey 2/BD007/example.tga

15
Nicolas

私はこのようなものがbusyboxで機能すると信じています:

du `cat filelist.txt` | awk '{i+=$1} END {print i}'

私はあなたと同じ環境ではありませんが、ファイル名にスペースに関する問題が発生した場合は、次のようなものでも機能します。

cat filelist.txt | while read file;do
  du "$file"
done | awk '{i+=$1} END {print i}'

編集1
@ stewは以下の彼の投稿のとおりです。duはディスク使用量を示しており、正確なファイルサイズではありません。動作を変更するには、busyboxが-aフラグを使用するため、正確なファイルサイズを取得するためにdu -a "$file"を試して、出力/動作を比較してください。

13
Mattias Ahnberg
du -c `cat filelist.txt` | tail -1 | cut -f 1

-c行「合計サイズ」を追加します。
tail -1最後の行を取ります(合計サイズ)。
cut -f 1は単語「合計」を切り取ります。

8
olegzhermal

この問題の別の解決策を次に示します。

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-
4
dsamarin

Linuxツールがこれに対応しているかどうかはわかりませんが、

cat /tmp/filelist.txt  |xargs -d \\n du -c

そう、xargsは区切り文字を改行文字に設定し、duは総計を生成します。

http://busybox.net/downloads/BusyBox.html を見ると、「busybox du」は総計オプションをサポートしているようですが、「busybox xargs」はカスタム区切り文字をサポートしていません。

繰り返しますが、あなたのツールセットはわかりません。

4
cjc
while read filename ;  do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'

これは、Mattias Ahnbergのソリューションに似ています。 「read」を使用すると、スペースのあるファイル名/ディレクトリの問題を回避できます。ファイルサイズを取得するには、statではなくduを使用します。 duは、ファイルサイズではなく、ディスク上で使用している容量を取得しています。ファイルシステムによっては、1バイトのファイルでもディスク上で4kを占有します(またはブロックサイズが何であっても)。したがって、1バイトのファイルの場合、statは1バイトを示し、duは4kを示します。

4
stew

次のようなものを試してください:

$ cat filelist.txt | xargs ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

パスのスペースを適切に処理するには:

$ find /path/to/files -type f -print0 | xargs -0 ls -l | awk '{x+=$5} END {print "total bytes: " x}' 
2
EEAA

cat docs.txt | xargs -d \\n du -sk | awk '{total+=$1} END{print total}'

1
Pradeep