Unixでls
を使ってサブディレクトリの合計サイズとそのすべての内容を一覧表示することは可能ですか(通常は4Kはディレクトリファイルそのものである)。 I.E.
total 12K
drwxrwxr-x 6 *** *** 4.0K 2009-06-19 10:10 branches
drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags
drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk
Manページを調べた後、私は空になってきました。
次のようにしてください。
du -sh *
のショートバージョン:
du --summary --human-readable *
du
: _ d _ isk _ u _ sage
-s
:指定された各ファイルの要約を表示します。 (-d 0
と同等)
-h
: "人間が読める"出力。単位の接尾辞を使用します。 _ b _ yte、 _ k _ ibibyte(KiB)、 _ m _ ebibyte(MiB)、 _ g _ ibibyte(GiB)、 _ t _ ebibyte(TiB)、および _ p _ ebibyte(PiB)。 (BASE2)
du -sk * | sort -n
はフォルダをサイズ順に並べ替えます。スペースを確保するのに役立ちます。
du -sh * | sort -h
これは人間が読める形式で表示されます。
現在のディレクトリから最大のディレクトリを人間が読める形式で一覧表示するには:
du -sh * | sort -hr
行数を制限するためのより良い方法は
du -sh * | sort -hr | head -n10
表示される行数を制限するために-n
フラグの接尾辞を増やすことができる場所
サンプル:
[~]$ du -sh * | sort -hr
48M app
11M lib
6.7M Vendor
1.1M composer.phar
488K phpcs.phar
488K phpcbf.phar
72K doc
16K nbproject
8.0K composer.lock
4.0K README.md
読みやすくするために便利です。
ls -lh
形式で表示するには、次のようにします。
(du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }'
Awkのコードは説明した:
if($1 == "total") { // Set X when start of ls is detected
X = 1
} else if (!X) { // Until X is set, collect the sizes from `du`
SIZES[$2] = $1
} else {
// Replace the size on current current line (with alignment)
sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0);
print $0
}
出力例:
drwxr-xr-x 2 root root 4.0K Feb 12 16:43 cgi-bin
drwxrws--- 6 root www 20M Feb 18 11:07 document_root
drwxr-xr-x 3 root root 1.3M Feb 18 00:18 icons
drwxrwsr-x 2 localusr www 8.0K Dec 27 01:23 passwd
あなたが望むコマンドは 'du -sk' du = "disk usage"です。
-kフラグを指定すると、デフォルトのディスクセクタ(512バイトブロック)ではなく、キロバイト単位で出力されます。
-sフラグはトップレベルディレクトリ(デフォルトではカレントディレクトリ、またはコマンドラインで指定されたディレクトリ)内のものだけをリストします。この点でduがlsと反対の動作をすることは奇妙です。デフォルトではduは再帰的に各サブディレクトリのディスク使用量を表示します。対照的に、lsは指定されたディレクトリのリストファイルだけを与えます。 (ls -Rは再帰的な振る舞いをします。)
このシェル関数宣言をシェル初期化スクリプトに入れます。
function duls {
paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}
duls
とdu
の両方からの出力を(この順序で)表示するので、ls
と呼びました。
$ duls
210M drwxr-xr-x 21 kk staff 714 Jun 15 09:32 .
$ duls *
36K -rw-r--r-- 1 kk staff 35147 Jun 9 16:03 COPYING
8.0K -rw-r--r-- 1 kk staff 6962 Jun 9 16:03 INSTALL
28K -rw-r--r-- 1 kk staff 24816 Jun 10 13:26 Makefile
4.0K -rw-r--r-- 1 kk staff 75 Jun 9 16:03 Makefile.am
24K -rw-r--r-- 1 kk staff 24473 Jun 10 13:26 Makefile.in
4.0K -rw-r--r-- 1 kk staff 1689 Jun 9 16:03 README
120K -rw-r--r-- 1 kk staff 121585 Jun 10 13:26 aclocal.m4
684K drwxr-xr-x 7 kk staff 238 Jun 10 13:26 autom4te.cache
128K drwxr-xr-x 8 kk staff 272 Jun 9 16:03 build
60K -rw-r--r-- 1 kk staff 60083 Jun 10 13:26 config.log
36K -rwxr-xr-x 1 kk staff 34716 Jun 10 13:26 config.status
264K -rwxr-xr-x 1 kk staff 266637 Jun 10 13:26 configure
8.0K -rw-r--r-- 1 kk staff 4280 Jun 10 13:25 configure.ac
7.0M drwxr-xr-x 8 kk staff 272 Jun 10 13:26 doc
2.3M drwxr-xr-x 28 kk staff 952 Jun 10 13:26 examples
6.2M -rw-r--r-- 1 kk staff 6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz
11M drwxr-xr-x 42 kk staff 1428 Jun 10 13:26 src
$ duls doc
7.0M drwxr-xr-x 8 kk staff 272 Jun 10 13:26 doc
$ duls [bM]*
28K -rw-r--r-- 1 kk staff 24816 Jun 10 13:26 Makefile
4.0K -rw-r--r-- 1 kk staff 75 Jun 9 16:03 Makefile.am
24K -rw-r--r-- 1 kk staff 24473 Jun 10 13:26 Makefile.in
128K drwxr-xr-x 8 kk staff 272 Jun 9 16:03 build
説明:
paste
ユーティリティは、指定した指定に従って、入力から列を作成します。 2つの入力ファイルがあると、タブを区切り文字として並べて表示します。
最初のファイル(実際には入力ストリーム)としてdu -hs -- "$@" | cut -f1
の出力を、2番目のファイルとしてls -ld -- "$@"
の出力を渡します。
この関数では、"$@"
はすべて二重引用符で囲まれたすべてのコマンドライン引数のリストに評価されます。したがって、スペースなどで文字やパス名をグロブすることを理解できます。
二重マイナス(--
)は、コマンドラインオプションの終わりをdu
とls
に知らせます。これらがなければ、duls -l
とdu
を混同し、du
にls
が持っていないオプションはls
を混同するでしょう(そして両方のユーティリティに存在するオプションは同じことを意味しないかもしれません、そしてそれはかなり混乱でしょう)。
cut
の後のdu
は単にdu -hs
出力の最初の列(サイズ)を切り取るだけです。
私はdu
の出力を左側に置くことにしました。そうでなければ、(ファイル名の長さが異なるため)揺らぎのある右側の列を管理する必要がありました。
コマンドはコマンドラインフラグを受け付けません。
これはbash
とksh93
の両方でテストされています。 /bin/sh
では動作しません。
du -h --max-depth=1 . | sort -n -r
私はいつもdu -sk
(ファイルサイズをキロバイトで示す-k
フラグ)を代わりに使用します。
これは私が好きなものです
update :現在のディレクトリのファイルを表示せず、ディレクトリのみを一覧表示するので、前のものは好きではありませんでした。
Ubuntuの/var
の出力例:
Sudo du -hDaxd1 /var | sort -h | tail -n10
4.0K /var/lock
4.0K /var/run
4.0K /var/www
12K /var/spool
3.7M /var/backups
33M /var/log
45M /var/webmin
231M /var/cache
1.4G /var/lib
1.7G /var
同じディレクトリ内のdu -sch *。
du -S
du には別の便利なオプションがあります: du にサブディレクトリのサイズを含めないように指示する-S, --separate-dirs
- 場合によっては便利です。
例1 - only ディレクトリ内のファイルサイズを表示します。
du -Sh *
3,1G 10/CR2
280M 10
例2 - ディレクトリ内のファイルサイズとサブディレクトリを表示します。
du -h *
3,1G 10/CR2
3,4G 10
これらはすべて素晴らしい提案ですが、私が使用するものは次のとおりです。
du -ksh * | sort -n -r
-ksh
は、ファイルとフォルダが人間が読める形式で、メガバイト、キロバイトなどでリストされていることを確認します。次に、大きい順に並べ替えます。
このコマンドの唯一の欠点は、ギガバイトがメガバイトより大きいことをコンピュータが認識していないため、番号順に並べ替えられるだけで、次のようなリストが見つかることです。
120K
12M
4G
ユニットをよく見てください。
このコマンドはMacでも機能します(sort -h
は、例えばしません)。
そのためのdu
コマンドを見てください
du -sm * | sort -nr
サイズで出力
ファイルのサイズを比較したい場合は、単なる警告です。 duはファイルシステム、ブロックサイズなどによって結果が異なります。
ファイルのサイズが異なることがあります。ローカルハードディスクとUSB大容量記憶装置の同じディレクトリを比較します。私はディレクトリサイズを合計するためにlsを含めて、次のスクリプトを使います。すべてのサブディレクトリを考慮に入れたバイト単位の結果。
echo "[GetFileSize.sh] target directory: \"$1\""
iRetValue=0
uiLength=$(expr length "$1")
if [ $uiLength -lt 2 ]; then
echo "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!"
iRetValue=-1
else
echo "[GetFileSize.sh] computing size of files..."
# use ls to compute total size of all files - skip directories as they may
# show different sizes, depending on block size of target disk / file system
uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}')
uiLength=$(expr length "$uiTotalSize")
if [ $uiLength -lt 1 ]; then
uiTotalSize=0
fi
echo -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\""
fi
exit "$iRetValue"
ncdu
ncurses du
この素晴らしいCLIユーティリティを使えば、大きなファイルやディレクトリを対話的に簡単に見つけることができます。
たとえば、 よく知られているプロジェクトのツリーの内側から
Sudo apt-get install ncdu
ncdu
その結果は以下のとおりです。
それから、私はキーボードの上下左右に入って/drivers
フォルダに入ると、次のようになります。
ncdu
はツリー全体の起動時に一度だけファイルサイズを再帰的に計算するので効率的です。
「総ディスク使用量」対「見かけのサイズ」はdu
に似ています、そして私はそれを以下で説明しました: なぜ `du`の出力はしばしば` du -b`と違うのですか
プロジェクトホームページ: https://dev.yorhel.nl/ncdu
関連する質問
Ubuntu 16.04でテスト済み。
現在のディレクトリのファイルとサブディレクトリのサイズを再帰的に表示するには
du -h .
同じサイズ情報 but なしを表示してそれらのサブディレクトリを再帰的に表示する(これは巨大なリストになる可能性があります)には、 --max-depth オプションを使用します。
du -h --max-depth=1 .
しばらくの間、bashでrm
コマンドを使用する代わりに、Nautilus(RHEL 6.0のGnomeデスクトップ上)を使用してホームフォルダー上のファイルを削除しました。その結果、合計サイズは
du -sh
私が使用したとき、各サブディレクトリのディスク使用量の合計と一致しませんでした
du -sh *
Nautilusが削除されたファイルをそのゴミ箱フォルダに送信し、そのフォルダがdu -sh *
コマンドにリストされていないことに気付くまでに少し時間がかかりました。したがって、誰かが同じ問題に直面した場合に備えて、これを共有したいと思いました。
うーん、最良の方法はこのコマンドを使用することです:
du -h -x / | sort -hr >> /home/log_size.txt
その後、あなたはあなたのすべてのサーバー上のすべてのサイズのフォルダーを取得することができるでしょう。最大のサイズを見つけるためにあなたに役立つのは簡単です。
以下は覚えやすいです
ls -ltrapR
ディレクトリの内容を一覧表示する
-l長いリスト形式を使用します
-t変更時刻順に並べ替えます。最新のものが最初です。
ソート中に-r、 - reverseの順序を逆にする
-a、 - allは、で始まるエントリを無視しません。
-p、--indicator-style =ディレクトリにスラッシュを追加/表示する
-R、 - recursive listサブディレクトリを再帰的に
initスクリプトに.bashrcのように配置します。必要に応じてdefを調整します。
duh() {
# shows disk utilization for a path and depth level
path="${1:-$PWD}"
level="${2:-0}"
du "$path" -h --max-depth="$level"
}
ディレクトリを一覧表示するsize
をさらに制御したい場合は、次のようにthreshold
(-t
)スイッチを使用できます。
$ du -ht 1000000000 | sort --reverse
du
- d
isk u
sageh
- 人間が読める形式t
- しきい値サイズ
ここでは、サイズが1GBを超えるすべてのディレクトリを一覧表示します。
$ du -ht 1G | sort --reverse
説明 :
に記述されている単位 続く:
K、M、G、T、P、E、Z、Y(1024のべき乗)または
KB、MB、GB、TB、PB、EB、ZB、YB(1000のべき乗)。
私の場合は、rsyncを使ってミラーリングした後、2つの異なるサーバー上の同じディレクトリを比較しました。
スクリプトを使用する代わりに、サイズをバイト単位で数えるdu
に-b
フラグを追加し、2つのサーバーの違いを排除できると判断した範囲で判断しました。わかりやすい出力を得るために-s -h
を使うことができます。