各ファイルとディレクトリのサイズをリストし、Bashでサイズの降順で並べ替える方法は?


108

Bashでディレクトリのサイズを取得するのは簡単ではないことがわかりましたか?

と入力するとls -<some options>、ディレクトリのファイルサイズとファイルの合計の合計が同時に一覧表示され、サイズ順に並べ替えることができます。

それは可能ですか?


2
ディレクトリの「サイズ」とは正確にはどういう意味ですか?その下にあるファイルの数(再帰的かどうか)?その下のファイルのサイズの合計(再帰的かどうか)?ディレクトリ自体のディスクサイズは?(ディレクトリは、ファイル名やその他の情報を含む特別なファイルとして実装されます。)
Keith Thompson

その下のファイルのサイズの合計を再帰的にする必要があります
Kit Ho

1
@キット:それduが答えです。
キース・トンプソン、

@KeithThompson @KitHo duコマンドはファイルスペースの使用量を推定するため、正確なサイズを取得する場合は使用できません。
ztank1013 2011

@ ztank1013:「正確なサイズ」の意味にもよりますがdu、少なくともGNU coreutilsバージョンには、情報を提供するオプションがある可能性があります。
キーストンプソン

回答:


218

ディレクトリに移動して、次のコマンドを実行します。

du -a --max-depth=1 | sort -n

または、人間が読めるサイズの-hと、より大きなディレクトリ/ファイルを最初に印刷する-rを追加します。

du -a -h --max-depth=1 | sort -hr

23
du -hsort -hを確実にするためにも、981M前にソートと言う必要があります1.3Gsort -n数字のみが考慮されることになると、彼らは間違った方法ラウンドになるだろう。
Smylers 2013

これには、現在のディレクトリ内の個々のファイルのサイズは表示されません。サブディレクトリのサイズと現在のディレクトリの合計サイズのみが表示されます。(OPの質問に答えるために)出力に個々のファイルをどのように含めますか?
エリックトラウトマン2014

また、あなたが追加する必要があるファイルの一覧表示する@ErikTrautman -aと使用--allの代わりに、--max-depth=1そのようにdu -a -h --all | sort -h
フランコ

驚くばかり!私はここ数年、何かしらのことをやっています。:)
コルビーブレア

6
sort -h唯一のGNUのバージョンで動作します/ Linuxでは、BSD / OS Xと運
djule5

20

どうやら--max-depthオプションはduコマンドのMac OS Xのバージョンにはありません。代わりに以下を使用できます。

du -h -d 1 | sort -n


どうやら、しかし驚くことではない。
Josh Habdas

20
du -s -- * | sort -n

(これは隠しファイル(.dotfiles)を表示しません)

使用du -smMbのユニットなどI常に使用するために

du -smc -- * | sort -n

-c明らかな理由で合計行()が一番下になるからです:)

PS:

  • dotfilesを処理するためのコメントを参照してください
  • 私は頻繁に使用します。例: 'du -smc / home / / | sort -n | tail 'は、大きなビットが正確にどこに座っているかを感じます。

5
du --max-depth=1|sort -nまたはfind . -mindepth 1 -maxdepth 1|xargs du -s|sort -nドットファイルを含めるためにも。
Arnaud Le Blanc

@arnoud:私もそれを使用していますが、この質問(/ answer)に適切な追加とは思えませんでした:)
sehe

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -n見つかったパスの一部にスペースが含まれている可能性がある場合は@ arnaud576875 。
Lri

1
これは、最大の人間が読めるビューを得るための素晴らしい変種です:sudo du -smch * | sort -h | tail
marsbard

16

コマンド

du -h --max-depth=0 * | sort -hr

出力

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

説明

  • du 「ディスク使用量」を表示します
  • h 「人間が読める」(並べ替えとduの両方)
  • max-depth=0duサブフォルダーのサイズを表示しないことを意味します(すべてのサブフォルダー、サブサブフォルダー、...、フォルダー内のすべてのファイルのすべてのサイズを表示する場合は削除してください)
  • r 「逆」用(最大のファイルが最初)

NCDU

この質問に来たとき、ファイルシステムをクリーンアップしたいと思いました。コマンドラインツールncduは、このタスクに適しています。

Ubuntuへのインストール:

$ sudo apt-get install ncdu

使用法:

ncdu [path]コマンドラインに入力するだけです。パスを分析するための数秒後、次のようなものが表示されます。

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

現在ハイライトされている要素をdで削除し、CTRL+ で終了しますc


du -hs * |と書くこともできます ソート-時間。-s(要約)は--max-depth = 0と同じです
rasmusx

5

ls -Sサイズ順に並べ替えます。次に、サイズも表示するためにls -lS、長い(-l)をサイズ(-S)でソートして表示します。-h物事を読みやすくするために、私も通常追加していますls -lhS


1
ああ、すみません、それはあなたの投稿から明らかではありませんでした。あなたが欲しいdu、誰かがそれを投稿したようです。@sehe:実際の定義に依存します—ディレクトリがそれ自体を格納するために使用しているスペースの量を示しています。(サブエントリのサイズも増えるわけではありません。)乱数ではなく、常に4KiBであるとは限りません。
タナトス

1

シンプルで高速:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* GNU Parallelが必要です。


0

私はあなたが何をしたいのか理解できたと思います。これにより、すべてのファイルとすべてのディレクトリの並べ替えられたリストが、ファイルサイズとディレクトリ内のコンテンツのサイズで並べ替えられます。

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n

気にしないでください、seheははるかに単純なソリューションを提示しました。毎日新しいことを学ぶ!
dvorak '18

私は使用することduはオプションではないと思います、それはあなたにちょうどおおよその結果を与えるでしょう。
ztank1013 '19

0

[拡張バージョン]
これは、以下の初期バージョンよりもはるかに高速で正確であり、現在のディレクトリのすべてのファイルサイズの合計を出力します。

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

stat -c %sファイルに対するコマンドは、サイズをバイト単位で返します。trここでのコマンドは、xargsコマンドの制限を克服するために使用されます(どうやらパイプを使用するとxargs、より多くの行で結果が分割され、コマンドのロジックが壊れます)。したがって、tr改行を+(プラス)記号に置き換える処理を行っています。sed最終+文字列からの不満を避けるために、結果の文字列から最後の符号を削除する唯一の目標bcて、通常どおりに計算を(基本的な計算機)コマンドがあります。

パフォーマンス:いくつかのディレクトリでテストしたところ、150.000以上のファイル(fedora 15ボックスの現在のファイル数)を超えており、すばらしい結果だと思います。

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

du -sb /コマンドと比較したい場合に備えて、推定ディスク使用量をバイト単位で出力します(-bオプション)

# du -sb /
12684646920 /

duユーティリティが各ファイルに割り当てられたスペースを返し、実際に消費されたスペースではないため、コマンドの計算よりも少し大きいと思っていました。

[初期バージョン]フォルダーの正確な合計サイズを知る必要がある場合
は、duコマンドを使用できません。duファイル領域の使用量を推定する。したがって、それは誤った結果、概算(おそらく合計サイズに近いかもしれませんが、あなたが探している実際のサイズよりも大きい可能性があります)につながります。

私はあなたの質問に答える別の方法があるかもしれないと思いますが、これは私のものです:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

ですべてのファイルを検索します。ディレクトリ(変更。は任意のディレクトリに変更)、隠しファイルも含まれ、(を使用してxargs)それらの名前を1行で出力してから、を使用して詳細なリストを作成しls -lます。この(ときどき)巨大な出力は、cutコマンドにパイプされ、5番目のフィールド(-f5)だけがバイト単位で取得され、再びパイプxargsされて、空白で区切られた1行のサイズが再び生成されます。次に、各空白スペースをプラス(+)記号で置き換えるsedマジックを実行し、最後にbc(基本的な計算機)計算を実行します。

追加のチューニングが必要な場合があり、lsコマンドが引数リストについて不平を言うのが長すぎる場合があります。


ディレクトリが大きすぎる場合、長時間電話が切れるので、ホームディレクトリで作業してみてください:p
Kit Ho

@KitHoよく、私はすべてのファイルを検索してそのサイズを追加せずに正確な結果を得る簡単かつ迅速な方法はないので、コマンドの遅延は主に検索されたディレクトリの下にあるファイルの数に依存します...改善の余地があります...いい挑戦です!
ztank1013 '19

@KitHoこんにちは、私の回答の拡張バージョンを見てください...そしてもちろん私に知らせてください!
ztank1013 2011

0

別の簡単な解決策。

$ for entry in $(ls); do du -s "$entry"; done | sort -n

結果は次のようになります

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

「du -s」を「du -sh」に変更すると、人間が読めるサイズが表示されますが、この方法ではソートできません。


0

以下を使用して、サイズdu -hでファイルを一覧表示できます。ソート-時間| moreまたはdu -h --max-depth = 0 * | ソート-時間| もっと


0

私は簡単な方法でduを使用する傾向があります。

du -sh */ | sort -n

これにより、どのディレクトリが最もスペースを消費しているかがわかります。その後、より正確な検索を実行できます。


この種の方法は機能しますが、ソート時にファイルのサイズの単位を無視します。
Benjamin Engwall、2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.