web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルのコンテンツの合計サイズ

lsまたはduを使用すると、各ファイルが占有しているディスク容量を取得します。

各ファイルを開いてバイト数をカウントした場合に取得するファイルおよびサブディレクトリ内のすべてのデータの合計が必要です。各ファイルを開いてカウントせずにこれを取得できる場合、ボーナスポイント。

96
Arthur Ulfeldt

ディスク上のファイルが占有するサイズではなく「見かけのサイズ」(各ファイルのバイト数)が必要な場合は、-bまたは--bytesオプションを使用します(Linuxの場合) GNU coreutils )のシステム:

% du -sbh <directory>
103
Arkady

du -sbを使用:

du -sb DIR

必要に応じて、hオプションを追加して、よりユーザーフレンドリーな出力にします。

du -sbh DIR
44
rob

ディレクトリにcdし、次に:

du -sh

ftw!

もともとそれについてここに書いた: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/

24
Andrew Odendaal

単なる代替案:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d'はディレクトリを除外します。

16
Barun

statの「%s」形式は、ファイルの実際のバイト数を示します。

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

数値を合計するためのお気に入りの方法 に置き換えてください。

13
Nelson

フォルダーが作成されると、多くのLinuxファイルシステムは4096バイトを割り当てて、ディレクトリ自体に関するメタデータを保存します。このスペースは、ディレクトリが大きくなるにつれて4096バイトの倍数だけ増加します。

duコマンド(-bオプションの有無にかかわらず)このスペースを数える

mkdir test && du -b test

空のディレクトリの場合、結果は4096バイトになります。したがって、10000バイトのファイルを2つディレクトリに入れると、du -sbで指定される合計量は24096バイトになります。

質問を注意深く読んだ場合、これは尋ねたものではありません。質問者は尋ねた:

各ファイルを開いてバイト数をカウントした場合に取得するファイルおよびサブディレクトリ内のすべてのデータの合計

上記の例では、24096ではなく20000バイトである必要があります。

したがって、正解は、Nelson回答とhlovdalスペースを含むファイル名を処理するための提案:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'
3
bytepan

組み込みシステムでbusybox su "を使用すると、duで正確なバイトを取得できず、取得できるのはKバイトだけです。

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)
3
Sam Liao

Linux/UnixとGit Bash for Windowsの両方で機能する「ファイルとサブディレクトリ内のすべてのデータの合計」をバイト単位で取得するには、少なくとも3つの方法があります。参考までに、それらはかなり深いファイルシステムのルートで実行されました(30,027個のディレクトリに71,158個のファイルを含むMagento 2 Enterpriseインストールのdocroot)。

1。

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2。

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


これら2つも機能しますが、Git Bash for Windowsには存在しないコマンドに依存しています。

1。

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2。

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


現在のディレクトリの合計のみが必要な場合は、-maxdepth 1findに追加します。


提案されたソリューションのいくつかは正確な結果を返さないため、代わりに上記のソリューションを使用することに注意してください。

$ du -sbh
832M    .

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133
2
thdoan

duは便利ですが、findは、一部のファイルのサイズのみを計算する場合(たとえば、拡張子によるフィルターを使用する場合)に便利です。また、find自体が各ファイルのサイズをバイト単位で出力できることに注意してください。合計サイズを計算するには、次の方法でdcコマンドを接続します。

find . -type f -printf "%s + " | dc -e0 -f- -ep

ここでfindは、123 + 456 + 11 +のようなdcの一連のコマンドを生成します。ただし、完成したプログラムは0 123 + 456 + 11 + pのようになります(後置記法を忘れないでください)。

したがって、完成したプログラムを取得するには、stdinからシーケンスを実行する前に0をスタックに配置し、実行後にトップ番号を出力する必要があります(最後にpコマンド)。 dcオプションで実現します:

  1. -e0は、-e '0'をスタックに置く0の単なるショートカットです。
  2. -f-は、stdin(ここでfindによって生成されたコマンド)からの読み取りおよび実行コマンド用です。
  3. -epは結果の印刷用です(-e 'p')。

284.06 MiBのようにMiBでサイズを印刷するには、代わりにポイント3で-e '2 k 1024 / 1024 / n [ MiB] p'を使用できます(ほとんどのスペースはオプションです)。

1
ruvim

Win32 DOSの場合:

c:> dir/s c:\ directory\you\want

最後から2行目は、ファイルが何バイトを占めるかを示します。

これはすべてのファイルとディレクトリを読み取ることを知っていますが、状況によってはより速く動作します。

1
Sun

これは役立つかもしれません:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

上記のコマンドは、ディレクトリサイズを残してすべてのファイルを合計します。

1
Ataul Haque

つかいます:

$ du -ckx <DIR> | grep total | awk '{print $1}'

ここで、<DIR>は検査するディレクトリです。

「-c」は、コマンドの「grep total」部分を使用して抽出された総計データを提供し、Kバイト単位のカウントはawkコマンドで抽出されます。

ここでの唯一の注意点は、テキスト「total」を含むサブディレクトリがある場合、それも吐き出されることです。

0
Rob Jones