2009-08-13 20:00:15 +0000 2009-08-13 20:00:15 +0000
76
76

LinuxやMac OS Xのディレクトリのサイズをコマンドラインから取得するには?

LinuxまたはMac OS Xディレクトリ内のすべてのファイルのサイズを(再帰的に)見つけるには、どのようなコマンドを使用しますか?

回答 (5)

83
83
83
2012-03-18 05:54:47 +0000

OS X で使用されている BSD 版の du は 512 バイトのブロックでサイズを報告しています。これはディスクの空き容量を教えてくれますが、これはデータ量よりも大きいものです。小さなファイルがたくさんある場合は、その差が大きくなることがあります。

これは例です。

これは正規のduが付いた値です。512バイトブロックになっています。

$ du -s
248 .

-h フラグの結果、より読みやすい数値がキロバイト単位で表示されます。予想通り、512バイトブロックの半分の数です。

$ du -hs
124K .

最後に、findawk を使って、ファイル内の実際のバイト数の合計を得ることができます。これはちょっと遅いですが、うまくいきます。

$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527

この値は Finder の Get Info ウィンドウで報告された数値と正確に一致します。(このファイルセットには変なフォークや xattr はありません。) du で報告された値よりもかなり小さい値です。

どのように動作するかというと、すべてのファイルのリストを取得して ls -l に渡し、awk を使ってバイト数をカウントします。-type f フラグは、ファイルのみ(ディレクトリではなく)が ls に送られるようにするためのものです。このフラグがない場合、ディレクトリ名もlsに送られ、各ファイルは2回、1回は個々のファイルとして、もう1回はディレクトリ内の項目としてリストアップされます。

GNU 版の du は、ブロックではなく実際のバイトで値を与えることができます。BSD版のduは柔軟性に欠けているのが残念です。

75
75
75
2009-08-13 20:01:52 +0000

1つのファイルのサイズを表示

du -h path_to_a_file

ディレクトリの内容、各サブディレクトリ、および各個別ファイルのサイズを表示します。

du -h path_to_a_directory

ディレクトリの内容のサイズを表示。

du -sh path_to_a_directory

0x6&

9
9
9
2013-11-11 22:31:48 +0000

du - ファイルサイズではなく、ディスクの使用量を教えてくれます。

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

上記のターミナルコード(私はOSX 10.6を使用しています)は私にとって最高の結果を提供してくれて、"find … -exec"

クイックベンチマーク

time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970

real 0m0.086s
user 0m0.029s
sys 0m0.073s

time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970

real 0m18.515s
user 0m2.929s
sys 0m9.339s
6
6
6
2015-03-05 14:03:07 +0000

すべてのファイルとディレクトリのサイズを再帰的に表示する du -ah . を使用することができます。

これはsortと組み合わせることができるので、現在のフォルダ内の最大のディレクトリのトップ20を表示します。

du -ah . | sort -rh | head -20

注意: -h のオプション sort は OSX/BSD では利用できないので、sortcoreutils からインストールし(例: brew を介して)、ビンパスを PATH に適用する必要があります。

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
2
2
2
2014-03-05 11:30:06 +0000

私はあなたの承認をすべて組み合わせて、人間が読める出力と組み合わせてみました……結果は以下の通りです。

#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'

要点へのリンクです。 https://gist.github.com/mlegenhausen/9365461

関連する質問

6
10
12
7
15