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


14

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

私の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


ファイルの数行の例を示します。
EEAA

追加されたファイルの例。
ニコラス

それはある種のNASですよね?busyboxがインストールされていますか?
cjc

はい、すでにインストールされていると思いますが、なぜですか?
ニコラス

回答:


13

私は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"ます。正​​確なファイルサイズを求めて、出力/動作を比較してください。


1
入力をありがとう、最初のコマンドが返されます/usr/bin/du: Argument list too long(私のファイルではほぼ80,000行)。2番目のコマンドは、Enterキーを押すとプロンプトを表示し、さらに何かを待っていますか?
ニコラス

あなたの環境で言うのは難しい。通常のコマンドプロンプトですか、それとも単に点滅しているプロンプトですか?後者の場合、結果を待つのが遅い場合があります。「入力プロンプト」の場合は、何らかの文字を見逃している可能性がありますか?そして、私が知らない通常のプロンプトであれば、入力する前にかなり徹底的にテストしました。:(
マティアスアンバーグ

私が次のことをするとき、それは「入力プロンプト」cat tgafiles.txt | while read file;do du "$file" done | awk '{i+=$1} END {print i}'です。おかげでマティアス
ニコラス

1
あ!1行にすべてを入れる場合は、別の行が必要です。次のように:(cat tgafiles.txt | while read file;do du "$file";done | awk '{i+=$1} END {print i}'つまり、実行前)。
マティアスアンバーグ

スポットオン!乾杯!(自分でこの間違いを見つけたかもしれませんが)
ニコラス

8
du -c `cat filelist.txt` | tail -1 | cut -f 1

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


これは、du-引数リストが長すぎるために失敗します。ファイルリストが大きい。以下のxargsの答えが最も簡単な解決策のようです。
Syclone0044

4

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

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

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

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

繰り返しますが、ツールセットについてはわかりません。


ここでの結果です:xargs: invalid option -- d
ニコラ・

素晴らしい:NASのbusybox Linuxでの作業は、キャンバス、スティック、麻ひもから機能する飛行機を構築しようとするMcGuyverのエピソードのようなものです。
cjc

別のマシンに余裕がある場合はどうでしょうか。興味のあるすべてのファイルを他の完全に機能するlinuxにコピーし、そこでStewのソリューションを実行してください。busyboxがこの種の機能を備えているかどうかを把握しようとするよりも、それを行う方がはるかに簡単かもしれません。
cjc

1
答えは最高だと思います。簡潔で、このスレッドの他の回答よりもはるかに高速です。
zymhan

いい答えです。-cxargsはduファイルリストが十分に長い場合に複数の呼び出しを行い、いくつかのdu合計を生成するため、除外することもできます。
qwr

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

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


ファイルサイズとディスクサイズについての良いコメント!
マティアスアンバーグ

非常に興味深いコメントは確かに、残念ながら私のLinuxは分かっていないstatコマンドを:stat: command not found
ニコラ・

「busybox stat」と言う必要があるかもしれません。
cjc

それはstat: applet not foundこの場合に言う
ニコラス

4

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

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

私(cygwin)の方du -bcがずっと高速です。
qwr

2

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

$ 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}' 

入力に感謝します。残念ながら、ファイル内のディレクトリ内のスペースが「\」でエスケープされていないという問題があると思います。したがって、ファイルリストを表示しているときに壊れます。
ニコラス

あなたはテキストファイルリストをバイパスし、単に出力からこれを生成できますfindか?
EEAA

残念ながら、リストは長すぎます。79159行のファイル(フルパス)があるため、ファイルに出力します。おそらく、検索結果のエスケープに関する引数を追加できますか?
ニコラス

私のLinuxシステム上で見つけるとは「-print0」引数はありません
ニコラ・

@Nicolas-それfindは、実際のfindバイナリの代わりにbusyboxの削除されたものを使用しているためです。
EEAA

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.