ディレクトリ内のすべてのファイルの内容の合計サイズ[クローズ]


103

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

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


1
ls実際には、ディスク容量ではなく、各ファイルのバイト数が表示されます。これで十分ですか?
グレッグヒューギル

3
duこの質問への回答には使用できないことに注意してください。これは、ディレクトリがディスク上で占めるディスク容量(ファイルのデータと補助ファイルシステムのメタ情報のサイズ)を示します。du出力は、すべてのファイルの合計サイズよりもさらに小さくすることができます。これは、ファイルシステムがディスク上に圧縮されたデータを格納できる場合、またはハードリンクが使用されている場合に発生することがあります。正解はlsおよびに基づいていfindます。こちらのネルソンバイトパンの回答、またはこの回答をご覧ください:unix.stackexchange.com/a/471061/152606
anton_rh

回答:


108

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

% du -sbh <directory>

1
私の新しい赤い帽子ボックスで動作しますが、残念ながら組み込みのDevボックスでは動作しません。
Arthur Ulfeldt

3
「見かけのサイズ」を人間が読める形式で表示する簡単な方法はありますか?使用している場合du -shb(この回答により示唆されるように)、-b設定が上書きするようで-h設定を。
Mathias Bynens 2012

6
@MathiasBynensフラグの順序を逆にします(つまり、du -sbh <dir>)。私のために働く。
Luis E.

2
@MathiasBynensdu -sh --apparent-size /dir/
ジョンゴシ

2
@Arkady CentOSとUbuntuでソリューションを試しましたが、小さなエラーがあります。「du -sbh」が欲しい。「-h」フラグは最後に来る必要があります。
theJollySin 2015年

46

使用du -sb

du -sb DIR

オプションで、hよりユーザーフレンドリーな出力のオプションを追加します。

du -sbh DIR

4
-bはMacOSのduの違法なオプションのようです
lynxoid

3
@lynxoid:brewを使用してGNUバージョンをインストールできますbrew install coreutils。コマンドとして利用できますgdu
neu242 2015

1
動作しません。ls-> file.gz hardlink-to-file.gzstat -c %s file.gz-> 9657212stat -c %s hardlink-to-file.gz-> 9657212du -sb-> 9661308。コンテンツの合計サイズではありませんが、ディレクトリがディスク上で占めるサイズです。
anton_rh

24

ディレクトリに移動し、次に:

du -sh

ftw!

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


1
これはシンプルで機能します!ありがとう。時々、私は-Lオプションを追加したいのでduシンボリックリンクに従います。
conradkleinespel 2014年

2
私のために働く(OS X上)
sam boosalis

2
これは簡単で機能しません。各ファイルを開いてバイト数を計算することで計算できるコンテンツの合計サイズではなく、ディレクトリがディスク上で占めるスペースを出力します。
anton_rh 2018

17

代替案:

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

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


4
完璧です。「隠しファイル」(ピリオドで始まるもの)を取得するために-aパラメータも追加します
Nicholi

より読みやすくするためにMBに(この場合は、PNG)は、特定のファイルタイプに分離されたと表現: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice

正解です。duこのソリューションとは異なり、実際にはファイル内のすべてのデータの合計サイズが1つずつ開かれ、それらのバイトがカウントされるかのようにカウントされます。しかし、はい、-A隠しファイルもカウントするためにパラメータを追加する必要があります。
anton_rh 2018

13

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

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

数字の合計には、お好きな方法を自由に使ってください。


4
特定のファイル名(スペースなどを含む)の問題を回避するには、「find。-type f -print0 | xargs -0 ...」を使用することをお勧めします。
hlovdal、2009

1
ええ、良い点。bsd 4.2になかった場合、使用したことを覚えていません:-(
ネルソン、

3
find -print0そしてxargs -0、スペースを含むファイル名のために必要とされます。OS Xは望んでいますstat -f %z
Kornel、2011

1
(statはスパースファイルで機能し、ファイルの公称サイズは大きく、レポートのようにディスクで使用される小さなブロックではないことに注意してくださいdu。)
Nelson

1
誤ってduユーティリティを使用する他の多くの回答とは異なり、この回答は正しいです。これは、ここでの回答と非常に似ています:unix.stackexchange.com/a/471061/152606。しかし、私は! -type d代わりに-type fシンボリックリンクをカウント代わりにします(シンボリックリンク自体のサイズ(通常は数バイト)。それが指すファイルのサイズではありません)。
anton_rh 2018

3

emebeddedシステムでbusyboxの「du」を使用する場合、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

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

duコマンド(-bオプションの有無にかかわらず)は、次のように入力して、このスペースをカウントします。

mkdir test && du -b test

空のディレクトリの結果は4096バイトになります。したがって、10000バイトの2つのファイルをdir内に置くと、du -sbによって与えられる合計量とは24096バイトになります。

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

各ファイルを開いてバイト数を数えた場合に得られるファイルとサブディレクトリ内のすべてのデータの合計

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

したがって、正解のIMHOは、ネルソンの回答とスペースを含むファイル名を処理するためのhlovdalの提案を組み合わせたものになる可能性があります。

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

2

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

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

3。

$ 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 1しますfindます。


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

$ 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

1
Windows用のGitのBashに関しては、 -のCygwinの場合は、dcの一部であるbcので、パッケージを取得しdc、それをインストールする必要がありますbc
ruvim

1

Win32 DOSの場合、次のことができます。

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

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

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


1

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

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

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

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

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

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


1

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

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

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


1
このソリューションは、Barun の回答と非常に似ていることに注意してください。しかし、このソリューションはサブディレクトリ内のファイルを合計しません。
ruvim

1
@ruvim、それは隠しファイルも合計しません。隠しファイルを合計するには、-Aオプションをに追加する必要がありますls
anton_rh 2018

0

使用する:

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

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

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

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

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