Linuxでディスクスペースがなくなった場所を追跡する?


532

Linuxシステムを管理するとき、パーティションがいっぱいになった後に犯人を突き止めるのに苦労することがよくあります。私は通常使用しますdu / | sort -nrが、大規模なファイルシステムでは、結果が返されるまでに時間がかかります。

また、これは通常、最悪の犯罪者を強調するのに成功しますが、私はしばしば 、より微妙なケースではduなく自分自身に頼りsort、出力を探し回らなければならなかったことに気付きました。

かなりの数のシステムを管理する必要があり、新しいソフトウェアのインストールが面倒であるため(特にディスク領域が不足している場合)、標準のLinuxコマンドに依存するコマンドラインソリューションを好むでしょう。


1
@Bartは、ここで投稿を改善するために時間を割いてくれてありがとう。タグは可視性のためではなく、質問を説明します。ディスクタグはここでは適切ではなく(タグの説明を参照)、この提案された編集で追加した少なくとも2つのタグは適切ではありませんでした(KaliはDebianではなく、PPAも関与していません)。
スティーブンキット

回答:


614

ncdu優れたコマンドラインディスク使用状況分析ツールをお試しください。

ここに画像の説明を入力してください


6
通常、単純な問題を解決するために何かをインストールするように求められるのは嫌ですが、これは素晴らしいことです。
gwg

14
sudo apt install ncduUbuntuでは簡単に入手できます。それは素晴らしいです
オリオンエドワーズ

10
どのファイルシステムがスペース不足かはご存知でしょう。この場合ncdu -x、スキャン対象のディレクトリと同じファイルシステム上のファイルとディレクトリのみをカウントできます。
ルークカズンズ

7
ベストアンサー。またsudo ncdu -rx /、ルートエリアドライブの最大のディレクトリ/ファイルのみをきれいに読み取る必要があります。(-r=読み取り専用、-x =同じファイルシステムにとどまる(意味:他のファイルシステムのマウントを走査しない))
bshea

5
ncduをインストールできないほどスペースが少ない
Chris

338

直進しないでくださいdu /。を使用dfしてあなたを傷つけているパーティションを見つけ、duコマンドを試してください。

私が試したいのは

# U.S.
du -h <dir> | grep '[0-9\.]\+G'
# Others
du -h <dir> | grep '[0-9\,]\+G'

「人間が読める形式」でサイズを印刷するためです。本当に小さなパーティションがない限り、ギガバイト単位のディレクトリをgrepすることは、あなたが望むものに対してかなり良いフィルターです。これには多少時間がかかりますが、クォータを設定していない限り、そうなると思います。

@jchavannesがコメントで指摘しているように、誤検出が多すぎる場合、式はより正確になる可能性があります。私はそれを改善する提案を取り入れましたが、まだ誤検知がありますので、トレードオフ(単純なexpr、悪い結果、より複雑で長いexpr、良い結果)があります。出力に表示される小さなディレクトリが多すぎる場合は、それに応じて正規表現を調整します。例えば、

grep '^\s*[0-9\.]\+G'

さらに正確です(1 GB未満のディレクトリはリストされません)。

あなたがいる場合行うクォータを持って、あなたが使用することができます

quota -v

ディスクを独占しているユーザーを見つけます。


2
これは非常にすばやく、簡単で実用的です
-zzapper

24
grep '[0-9]G'多くの誤検知が含まれており、小数部も省略されていました。これは私のために、より良い働い:sudo du -h / | grep -P '^[0-9\.]+G'
jchavannes

1
あなたは本当に大きなディレクトリを持っている場合は、あなたがたいと思う[GT]だけではなく、G
ウィトルウィウス

1
ファイルシステム内のすべてのディレクトリにわたって(怠usageに)ディスク使用量を継続的に監視するツールはありますか?Web UIにストリーミングできるものは何ですか?できればソフトリアルタイム情報。
CMCDragonkai

20
私が使用したいdu -h | sort -hr | head
8

104

はじめに、次の「概要」ビューを使用しますdu

du -s /*

その効果は、各引数のサイズ、つまり上記の場合のすべてのルートフォルダーのサイズを出力することです。

さらに、GNUduBSDのdu両方に深さ制限をかけることができます(しかしPOSIX duはできません!):

  • GNU(Linux、…):

    du --max-depth 3
  • BSD(macOS、…):

    du -d 3
    

これにより、出力表示が深さ3に制限されます。計算および表示されるサイズは、もちろん完全な深さの合計です。しかし、これにもかかわらず、ディスプレイの深さを制限すると、計算が大幅に高速化されます。

もう1つの便利なオプションは、「人間が読み取れる」出力(KiB、MiB などを使用)のための-h(GNUとBSDの両方の単語ですが、POSIXのみではありません)です。du


23
代わりに試すことにdu不満がある場合。-d--max-depth 5
ReactiveRaven

8
素晴らしいアンサー。私には正しいようです。をお勧めしdu -hcd 1 /directoryます。-hは人間が読める形式、cは合計、dは深さです。

私が使用していdu -hd 1 <folder to inspect> | sort -hr | head
jonathanccalixto

du --max-depth 5 -h /* 2>&1 | grep '[0-9\.]\+G' | sort -hr | head許可が拒否されました
srghma

49

次を使用して次のコマンドを実行することもできますdu

~# du -Pshx /* 2>/dev/null
  • この-sオプションは、各引数の合計を要約して表示します。
  • h Mio、Gioなどを印刷します。
  • x = 1つのファイルシステムにとどまる(非常に便利)。
  • P =シンボリックリンクをたどらない(たとえば、ファイルが2回カウントされる可能性があります)。

/rootディレクトリが表示されないように注意してください、それ~# du -Pshx /root 2>/dev/nullを取得するために実行する必要があります(一度、/rootディレクトリがいっぱいになったことを指摘せずに苦労しました)。

編集:修正されたオプション-P


2
du -Pshx .* * 2>/dev/null+隠し/システムディレクトリ
Mykhaylo Adamovych

27

ファイルシステムで最大のファイルを見つけるには、常に長い時間がかかります。定義により、大きなファイルを探してファイルシステム全体を走査する必要があります。唯一の解決策は、おそらくすべてのシステムでcronジョブを実行して、事前にファイルを準備することです。

もう1つ、duのxオプションは、duが他のファイルシステムにマウントポイントをたどらないようにするのに役立ちます。すなわち:

du -x [path]

私が通常実行する完全なコマンドは次のとおりです。

sudo du -xm / | sort -rn > usage.txt

この-m手段は結果をメガバイト単位で返しsort -rn、結果の大きい順にソートします。エディターでusage.txtを開くと、最大のフォルダー(/で始まる)が上部に表示されます。


3
-xフラグを指摘してくれてありがとう!
SamB

1
「最大の発見に時間がかかる..」 - >まあ、それは依存しますが、反対する傾向がある:などのユーティリティとその時間はかかりませんncdu-少なくとも速くよりも、duまたはfind(深さや引数に依存します)。..
bshea

ルートになりたくないので、ファイルが書き込まれる場所を調整する必要がありましたsudo du -xm / | sort -rn > ~/usage.txt
ブルーノ

20

私は常にを使用しますdu -sm * | sort -n。これにより、現在の作業ディレクトリのサブディレクトリが使用する量のソートされたリストがメビバイト単位で表示されます。

また、Windows上でWinDirStatが行うのと同様の「サイズビュー」モードを備えたKonquerorを試すこともできます。これにより、どのファイル/ディレクトリがほとんどのスペースを消費するかを視覚的に表現できます。

更新:最近のバージョンでは、du -sh * | sort -h人間が読めるファイルサイズを表示し、それらでソートすることもできます。(数字の末尾にはK、M、G、...が付きます)

KDE3のKonquerorのファイルサイズビューに代わるものをお探しの場合は、ファイルライトをご覧ください。


ただし、これはKonqueror 3.xのみです。ファイルサイズビューはまだ KDE4に移植されていません。

'du -sh * | sort -h 'は、Linux(Centos distro)ボックスで完全に機能します。ありがとう!
パハリアヨギ

18

現在のディレクトリの下にある上位25人の最悪の犯罪者にこれを使用します

# -S to not include subdir size, sorted and limited to top 25
du -S . | sort -nr | head -25

このコマンドは、時間とともにサイズが増加していると思われる隠しフォルダーを見つけるためのトリックを実行しました。ありがとう!
thegreendroid

これはバイト単位ですか?
ユーザー14

デフォルトでは、私のシステムでは、「du -S」は人間が読める素晴らしい出力を提供します。小さなファイルの場合は単純なバイト数を取得し、大きなファイルの場合は「KB」または「MB」のサフィックスが付いた数字を取得します。
serg10 14

du -Shを実行すると、人間が読み取れる出力を取得できます。
シッダールタ

@Siddharthaを追加する-hと、sort -nrコマンドの効果が変わる可能性があります-並べ替えが機能しなくなり、headコマンドも機能しなくなります
クレアマクレー

14

以前の会社では、夜間に実行され、特定のサイズを超えるファイルを識別するcronジョブを使用していました。たとえば、

検索/ -size + 10000k

検索するディレクトリをさらに選択し、オフラインになる可能性のあるリモートでマウントされたドライブに注意することができます。


-x findオプションを使用して、findコマンドの開始点以外のデバイスでファイルが見つからないことを確認できます。これにより、リモートでマウントされたドライブの問題が修正されます。
rjmunro

10

1つのオプションは、du / sortコマンドをcronジョブとして実行し、ファイルに出力することです。したがって、必要なときに既にそこにあります。


9

コマンドラインでは、du / sortメソッドが最適だと思います。サーバー上にいない場合は、Baobab-Disk Usage Analyzerをご覧ください。このプログラムの実行にも時間がかかりますが、すべての古いLinux ISOが存在する場所のサブディレクトリを簡単に見つけることができます。


2
SSH、FTP、SMB、およびWebDAVを介してリモートフォルダーをスキャンすることもできます。

これは素晴らしい。それらを視覚化するためにGUIを使用するとうまく機能するものもありますが、これもその1つです。とにかくCrashPlanのために私のサーバーにXサーバーが必要なので、それでも動作します。
タイマー

9

私が使う

du -ch --max-depth=2 .

必要に応じて最大深度を変更します。「c」オプションはフォルダの合計を印刷し、「h」オプションは必要に応じてK、M、またはGのサイズを印刷します。他の人が言ったように、それはまだすべてのディレクトリをスキャンしますが、大きなディレクトリを見つけやすいように出力を制限します。


9

二番目に行きxdiskusageます。ただし、実際にはduフロントエンドであり、ファイルからdu出力を読み取ることができることに注意してください。そのdu -ax /home > ~/home-duため、サーバーでscpファイルを実行し、グラフィカルに分析できます。または、sshにパイプします。


6

duの出力を単純なawkスクリプトに入力してみてください。このスクリプトは、ディレクトリのサイズがしきい値よりも大きいかどうかを確認します。あなたは待つ必要はありませんあなたは(対他の回答の多くの)情報を取得を開始する前に横断するツリー全体のために。

たとえば、次の例では、約500 MB以上を消費するディレクトリが表示されます。

du -kx / | awk '{ if ($1 > 500000) { print $0} }'

上記をもう少し再利用可能にするために、.bashrcで関数を定義できます(またはスタンドアロンスクリプトにすることもできます)。

dubig() {
    [ -z "$1" ] && echo "usage: dubig sizethreshMB [dir]" && return
    du -kx $2 | awk '{ if ($1 > '$1'*1024) { print $0} }'
}

そのdubig 200 ~/ため、200 MB以上を使用するディレクトリのホームディレクトリ(デバイスからのシンボリックリンクをたどらない)の下を調べます。


多数のgrepハックがより支持されているのは残念です。ああ、du -kduがKBユニットを使用していることを完全に
確認します-ndemou

-kについての良いアイデア。編集済み。
マークボーガーディング

さらにシンプルで堅牢:(du -kx $2 | awk '$1>'$(($1*1024))条件としてパターンのみを指定してawkを実行した場合、デフォルトのアクションはprint $0
-dave_thompson_085

良い点は@ date_thompson_085です。これは、私が知っているawkのすべてのバージョン(net / free-BSD&GNU)にも当てはまります。@マークborgerdingので、これはあなたが非常にちょうどあなたの最初の例を簡素化することができることを意味du -kx / | awk '$1 > 500000'
ndemou

@ mark-borgerding:どこかに数キロバイトしか残っていない場合は、このようにduの出力全体を保持することもできますdu -kx / | tee /tmp/du.log | awk '$1 > 500000'。あなたの最初のフィルタリングが無益であることが判明した場合、あなたはこのように他の値を試すことができますので、これは非常に有用であるawk '$1 > 200000' /tmp/du.logか、またはこのような完全な出力を検査sort -nr /tmp/du.log|lessファイルシステム全体を再スキャンせず
ndemou

4

私はdu(1)のグラフィカルな代替として古き良きxdiskusageが好きです。


質問のこの部分に注意してください:「...以来、標準のLinuxコマンドに依存するコマンドラインソリューションを好むでしょう」
-ndemou

4

以下を使用して概要を取得し、そこからドリルダウンすることを好みます...

cd /folder_to_check
du -shx */

これにより、GB、MBなどの人間が読める出力で結果が表示されます。また、リモートファイルシステムを通過することも防ぎます。この-sオプションは、見つかった各フォルダーの概要のみを表示するため、フォルダーの詳細に関心がある場合は、さらにドリルダウンできます。このソリューションではフォルダのみが表示されるため、ファイルが必要な場合は、アスタリスクの後に/を省略します。


4

ここでは言及していませんが、ファイルが削除またはハングした場合は、lsofも確認する必要があります。暴走したcronjobから5.9GBのtmpファイルを削除しました。

https://serverfault.com/questions/207100/how-can-i-find-phantom-storage-usageファイルのプロセス所有者(cron)を見つけるのを助けてから/proc/{cron id}/fd/{file handle #}、ファイルを少なくすることができました実行の開始を取得し、それを解決してから、 "">ファイルをエコーし​​てスペースを空にし、cronを自動的に閉じます。


3

端末から、dutreeを使用してディスク使用量を視覚的に表示できます

Rustで実装されているため、非常に高速で軽量です。

デュトリー

$ dutree -h
Usage: dutree [options] <path> [<path>..]

Options:
    -d, --depth [DEPTH] show directories up to depth N (def 1)
    -a, --aggr [N[KMG]] aggregate smaller than N B/KiB/MiB/GiB (def 1M)
    -s, --summary       equivalent to -da, or -d1 -a1M
    -u, --usage         report real disk usage instead of file size
    -b, --bytes         print sizes in bytes
    -f, --files-only    skip directories for a fast local overview
    -x, --exclude NAME  exclude matching files or directories
    -H, --no-hidden     exclude hidden files
    -A, --ascii         ASCII characters only, no colors
    -h, --help          show help
    -v, --version       print version number

Webサイトで使用方法の詳細をすべて表示する


2

コマンドラインdu(およびそのオプション)が最善の方法のようです。DiskHogはcronジョブからのdu / df情報も使用しているように見えるため、Peterの提案はおそらく単純で効果的な最良の組み合わせです。

FileLightKDirStatはGUIに最適です。)


2

あなたのような標準的なツールを使用することができますfindし、sortあなたのディスクスペースの使用状況を分析します。

サイズ別にソートされたディレクトリをリストします。

find / -mount -type d -exec du -s "{}" \; | sort -n

サイズでソートされたファイルをリストします

find / -mount -printf "%k\t%p\n" | sort -n

1
私は、ソートされた順序で大型を検出するため、これが最良の答えであることを見つける
ビマルクリシュナ

2

多分ことに注意することは価値があるmc(通常はディレクトリiノードのサイズのみデフォルトショーで(真夜中の司令官、古典的なテキストモードのファイルマネージャを) 4096)が、でCtrlSpace、メニューツールかで、あなたは人間が読めるで選択したディレクトリの占有スペースを見ることができます形式(例:のようなもの 103151M)。

たとえば、下の写真は2018年と2017年のバニラTeX Liveディストリビューションのフルサイズを示していますが、2015年と2016年のバージョンはiノードのサイズのみを示しています(ただし、実際にはそれぞれ5 Gbに近い)。

つまりCtrlSpace、実際のディレクトリレベルでのみ、1対1でmc実行する必要がありますが、ナビゲーションを行う際に非常に高速で便利なためncdu、必要ないかもしれません(実際、この目的のためだけが優れています)。それ以外の場合は、ncduから実行することもできますmcmc別の端末を終了または起動せずに。

mwe


1

最初に、次のようにディレクトリのサイズを確認します。

du -sh /var/cache/*/

1

過去数日間に大きなファイルが追加されていることがわかっている場合(3など)、「find」コマンドと「ls -ltra」最近追加されたファイルを検出できます。

find /some/dir -type f -mtime -3 -exec ls -lart {} \;

これにより-type f、ディレクトリではなくファイル( " ")のみが表示されます。過去3日間に変更されたファイル( " -mtime -3")のみをls -lart検索し、見つかった各ファイル( " -exec"部分)に対して" " を実行します。


1

不均衡なディスク領域の使用を理解するには、ルートディレクトリから始めて、その最大の子のいくつかを調べてみると便利です。

これを行うことができます

  • duの出力をファイルに保存する
  • 結果を繰り返し表示する

あれは:

# sum up the size of all files and directories under the root filesystem
du -a -h -x / > disk_usage.txt
# display the size of root items
grep $'\t/[^/]*$' disk_usage.txt

今、/ usrが大きすぎるとしましょう

# display the size of /usr items
grep $'\t/usr/[^/]*$' disk_usage.txt

今の場合は/ usr / localは疑い深く大きいです

# display the size /usr/local items
grep $'\t/usr/local/[^/]*$' disk_usage.txt

等々...


1

このコマンドを使用して、100Mbより大きいファイルを見つけました。

find / -size +100M -exec ls -l {} \;

0

du人間が読める形式の出力をegrep正規表現にパイプし、正規表現に一致させる最悪の犯罪者を追跡することに成功しました。

例えば:

du -h | egrep "[0-9]+G.*|[5-9][0-9][0-9]M.*"

500メガ以上のすべてが返されます。


算術演算にgrepを使用しないでくださいdu -k | awk '$1 > 500000'。代わりにawkを使用してください。最初の試行では、理解、編集、修正がはるかに簡単です。
ndemou

0

速度が必要な場合は、監視するファイルシステムでクォータを有効にし(ユーザーにクォータを設定する必要はありません)、quotaコマンドを使用するスクリプトを使用して、各ユーザーが使用しているディスク容量を一覧表示できます。例えば:

quota -v $user | grep $filesystem | awk '{ print $2 }'

特定のファイルシステム上の特定のユーザーのディスク使用量をブロックで示します。この方法で、数秒で使用状況を確認できるはずです。

クォータを有効にするには、/ quot / fstabファイルのファイルシステムオプションにusrquotaを追加してから再起動し、quotaonが呼び出される前にquotacheckがアイドル状態のファイルシステムで実行できるようにする必要があります。


0

ディープサンプリングを使用して、任意のディスクまたはディレクトリ内の腫瘍を見つける小さなアプリを次に示します。ディレクトリツリーを2回歩き、1回はそれを測定し、2回目はディレクトリの下の20個の「ランダム」バイトへのパスを出力します。

void walk(string sDir, int iPass, int64& n, int64& n1, int64 step){
    foreach(string sSubDir in sDir){
        walk(sDir + "/" + sSubDir, iPass, n, n1, step);
    }
    foreach(string sFile in sDir){
        string sPath = sDir + "/" + sFile;
        int64 len = File.Size(sPath);
        if (iPass == 2){
            while(n1 <= n+len){
               print sPath;
               n1 += step;
            }
        }
        n += len;
    }
}

void dscan(){
    int64 n = 0, n1 = 0, step = 0;
    // pass 1, measure
    walk(".", 1, n, n1);
    print n;
    // pass 2, print
    step = n/20; n1 = step/2; n = 0;
    walk(".", 2, n, n1);
    print n;
}

Program Filesディレクトリの出力は次のようになります。

 7,908,634,694
.\ArcSoft\PhotoStudio 2000\Samples\3.jpg
.\Common Files\Java\Update\Base Images\j2re1.4.2-b28\core1.zip
.\Common Files\Wise Installation Wizard\WISDED53B0BB67C4244AE6AD6FD3C28D1EF_7_0_2_7.MSI
.\Insightful\splus62\java\jre\lib\jaws.jar
.\Intel\Compiler\Fortran\9.1\em64t\bin\tselect.exe
.\Intel\Download\IntelFortranProCompiler91\Compiler\Itanium\Data1.cab
.\Intel\MKL\8.0.1\em64t\bin\mkl_lapack32.dll
.\Java\jre1.6.0\bin\client\classes.jsa
.\Microsoft SQL Server\90\Setup Bootstrap\sqlsval.dll
.\Microsoft Visual Studio\DF98\DOC\TAPI.CHM
.\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows CE\sqlce20sql2ksp1.exe
.\Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\docs\Partition II Metadata.doc
.\Microsoft Visual Studio .NET 2003\Visual Studio .NET Enterprise Architect 2003 - English\Logs\VSMsiLog0A34.txt
.\Microsoft Visual Studio 8\Microsoft Visual Studio 2005 Professional Edition - ENU\Logs\VSMsiLog1A9E.txt
.\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v2.0\WindowsCE\wce500\mipsiv\NETCFv2.wce5.mipsiv.cab
.\Microsoft Visual Studio 8\VC\ce\atlmfc\lib\armv4i\UafxcW.lib
.\Microsoft Visual Studio 8\VC\ce\Dll\mipsii\mfc80ud.pdb
.\Movie Maker\MUI\0409\moviemk.chm
.\TheCompany\TheProduct\docs\TheProduct User's Guide.pdf
.\VNI\CTT6.0\help\StatV1.pdf
7,908,634,694

ディレクトリは7.9gbであり、そのうちの

  • 〜15%はインテルFortranコンパイラーに送られます
  • 〜15%がVS .NET 2003になります
  • 〜20%がVS 8になります

これらのいずれかをアンロードできるかどうかを尋ねるのは簡単です。

また、ファイルシステム全体に分散しているファイルタイプについても説明しますが、一緒に使用すると、スペースを節約できる可能性があります。

  • 〜15%は、おおよそ.cabおよび.MSIファイルになります
  • 〜10%は、おおよそテキストファイルのログ記録に使用されます

「SmartDevices」や「ce」のサポート(〜15%)のように、おそらくなくてもできることもたくさんあります。

直線的な時間がかかりますが、頻繁に行う必要はありません。

見つかったものの例:

  • ない多く保存されたコードリポジトリ内のDLLのバックアップコピー本当に保存する必要があります
  • あいまいなディレクトリの下にある、サーバー上の誰かのハードドライブのバックアップコピー
  • 膨大なインターネット一時ファイル
  • 昔のドキュメントとヘルプファイルが必要な長い過去

0

私は同様の問題を抱えていましたが、このページの答えは十分ではありませんでした。次のコマンドがリストに最も役立つことがわかりました。

du -a / | sort -n -r | head -n 20

それは私に20人の最大の犯罪者を示すでしょう。ただし、これを実行しても、ファイルを既に削除していたため、実際の問題は表示されませんでした。キャッチは、削除されたログファイルを参照しているプロセスがまだ実行されていることです。そのため、最初にそのプロセスを強制終了しなければならず、その後、ディスク領域が空きとして表示されました。


良い点ですが、これはコメントであり、回答そのものではありません-この質問は回答が多すぎます
-ndemou

0

DiskReport.netを使用して、すべてのディスクのオンラインWebレポートを生成できます。

何回も実行すると、すべてのフォルダーの履歴グラフが表示され、成長したものを簡単に見つけることができます


このツールは、と「私は、標準のLinuxコマンドに依存しているコマンドラインのソリューションを好むだろう」「私は頻繁に自分自身をパーティションが満杯になった後、犯人を突き止めるのに苦労見つける」という質問には主に2つのポイントと一致しない
ndemou

0

JDiskReportと呼ばれるクロスプラットフォームのフリーウェアのすばらしい部分があります。これには、すべてのスペースを占有しているものを調べるためのGUIが含まれています。

スクリーンショットの例:
JDiskReportスクリーンショット

もちろん、ダウンロードしてインストールする前、またはこれを別のドライブ(USBサムドライブなど)にダウンロードする前に、手動で少しスペースを空ける必要があります。


(重複した質問の同じ著者の回答からコピー)

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