ls
またはdu
を使用すると、各ファイルが占有しているディスク容量を取得します。
各ファイルを開いてバイト数をカウントした場合に取得するファイルおよびサブディレクトリ内のすべてのデータの合計が必要です。各ファイルを開いてカウントせずにこれを取得できる場合、ボーナスポイント。
ディスク上のファイルが占有するサイズではなく「見かけのサイズ」(各ファイルのバイト数)が必要な場合は、-b
または--bytes
オプションを使用します(Linuxの場合) GNU coreutils )のシステム:
% du -sbh <directory>
du -sb
を使用:
du -sb DIR
必要に応じて、h
オプションを追加して、よりユーザーフレンドリーな出力にします。
du -sbh DIR
ディレクトリにcdし、次に:
du -sh
ftw!
もともとそれについてここに書いた: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/
単なる代替案:
ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
grep -v '^d'
はディレクトリを除外します。
statの「%s」形式は、ファイルの実際のバイト数を示します。
find . -type f |
xargs stat --format=%s |
awk '{s+=$1} END {print s}'
数値を合計するためのお気に入りの方法 に置き換えてください。
フォルダーが作成されると、多くの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}'
組み込みシステムで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)
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 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
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
オプションで実現します:
-e0
は、-e '0'
をスタックに置く0
の単なるショートカットです。-f-
は、stdin(ここでfind
によって生成されたコマンド)からの読み取りおよび実行コマンド用です。-ep
は結果の印刷用です(-e 'p'
)。284.06 MiB
のようにMiBでサイズを印刷するには、代わりにポイント3で-e '2 k 1024 / 1024 / n [ MiB] p'
を使用できます(ほとんどのスペースはオプションです)。
Win32 DOSの場合:
c:> dir/s c:\ directory\you\want
最後から2行目は、ファイルが何バイトを占めるかを示します。
これはすべてのファイルとディレクトリを読み取ることを知っていますが、状況によってはより速く動作します。
これは役立つかもしれません:
ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
上記のコマンドは、ディレクトリサイズを残してすべてのファイルを合計します。
つかいます:
$ du -ckx <DIR> | grep total | awk '{print $1}'
ここで、<DIR>は検査するディレクトリです。
「-c」は、コマンドの「grep total」部分を使用して抽出された総計データを提供し、Kバイト単位のカウントはawkコマンドで抽出されます。
ここでの唯一の注意点は、テキスト「total」を含むサブディレクトリがある場合、それも吐き出されることです。