追踪Linux上磁盘空间的去向?


532

在管理Linux系统时,我经常发现自己在分区已满后仍在努力寻找罪魁祸首。我通常使用,du / | sort -nr但在大型文件系统上,这需要很长时间才能返回任何结果。

同样,这通常可以成功地突出显示最严重的罪犯,但我经常发现自己在du没有sort 更微妙的情况下就诉诸于法律,然后不得不在输出中进行拖网捕捞。

我宁愿使用依赖于标准Linux命令的命令行解决方案,因为我必须管理很多系统,并且安装新软件很麻烦(尤其是在磁盘空间不足的情况下!)


1
@Bart感谢您抽出宝贵的时间在这里改善帖子,但是在添加标签时,我是否可以请您多加注意?标签不是为了可见,而是描述了问题。磁盘标签在这里不合适(请参见其标签说明),并且您在此建议的编辑中添加的至少两个标签在那里不合适(Kali不是Debian,并且不涉及PPA)。
Stephen Kitt

Answers:


614

试试看ncdu,一个出色的命令行磁盘使用分析器:

在此处输入图片说明


6
通常,我讨厌被要求安装一些东西来解决一个简单的问题,但这很好。
gwg '16

14
sudo apt install ncdu在ubuntu上可以轻松获得它。太好了
Orion Edwards

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'

因为它以“人类可读的形式”打印尺寸。除非您的分区非常小,否则对gb中的目录进行grepping可以很好地满足您的需求。这将需要一些时间,但是除非您设置配额,否则我认为这将是这样。

正如@jchavannes在评论中指出的那样,如果您发现过多的误报,则表达式可以变得更加精确。我结合了建议,虽然确实可以使建议更好,但是仍然存在误报,因此存在一些折衷(expr更简单,结果更糟; expr越长越复杂,结果越好)。如果输出中显示的目录太小,请相应地调整正则表达式。例如,

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

甚至更准确(不会列出<1GB目录)。

如果您确实有配额,则可以使用

quota -v

查找正在占用磁盘的用户。


2
这非常快速,简单且实用
zzapper 2012年

24
grep '[0-9]G'包含很多误报,还省略了任何小数。这对我来说效果更好:sudo du -h / | grep -P '^[0-9\.]+G'
jchavannes

1
如果您的目录真的很大,您会想要的[GT]不只是G
Vitruvius

1
有没有一种工具可以连续(懒惰地)监视文件系统中所有目录的磁盘使用情况?可以流式传输到Web UI的东西吗?最好是软实时信息。
CMCDragonkai 2015年

20
我喜欢使用du -h | sort -hr | head
augurar

104

乍一看,请使用的“摘要”视图du

du -s /*

效果是打印其每个参数的大小,即上述情况下的每个根文件夹。

此外,GNUduBSDdu都可以进行深度限制(但是POSIX du不能!):

  • GNU(Linux,…):

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

    du -d 3
    

当然,这会将输出显示限制为深度3。计算和显示的大小仍然是整个深度的总和。但是,尽管如此,限制显示深度还是可以大大加快计算速度。

另一个有用的选择是-h(在GNU和BSD上都使用单词,但同样,不是仅在POSIX上使用du)用于“人类可读”输出(即,使用KiB,MiB )。


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 =停留在一个文件系统中(非常有用)。
  • P =不要遵循符号链接(例如,这可能导致文件被计数两次)。

注意,该/root目录不会显示,您必须运行该目录~# du -Pshx /root 2>/dev/null(一次,我很努力地不指出/root目录已满)。

编辑:更正的选项-P


2
du -Pshx .* * 2>/dev/null+隐藏/系统目录
Mykhaylo Adamovych

27

在文件系统上查找最大的文件总是需要很长时间。根据定义,您必须遍历整个文件系统以查找大文件。唯一的解决方案可能是在所有系统上运行cron作业,以提前准备好文件。

另一件事,du的x选项对于防止du跟随装入点进入其他文件系统很有用。即:

du -x [path]

我通常运行的完整命令是:

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

-m方法以兆字节为单位返回结果,并将sort -rn结果的最大数量排在最前面。然后,您可以在编辑器中打开usage.txt,最大的文件夹(以/开头)将位于顶部。


3
感谢您指出-x旗帜!
SamB 2010年

1
“找到最大的文件需要很长时间。”->这要看情况了,但是往往会不同意:使用诸如ncdu-至少比duor 快find(或取决于深度和论点)之类的工具花费的时间并不长
。– bshea

由于我不想成为root用户,因此我不得不修改文件的写入位置:sudo du -xm / | sort -rn > ~/usage.txt
Bruno

20

我总是使用du -sm * | sort -n,它为您提供了当前工作目录的子目录用完了多少的排序列表,以兆字节为单位。

您也可以尝试使用Konqueror,它具有“大小视图”模式,类似于Windows上WinDirStat所做的工作:它可以直观地表示哪些文件/目录占用了您的大部分空间。

更新:在较新的版本上,您也可以使用du -sh * | sort -h它将显示人类可读的文件大小并按这些大小排序。(数字后缀为K,M,G,...)

对于寻求替代KDE3的Konqueror文件大小视图的人们来说,可以看看filelight,尽管它并不那么好。


不过,那只是Konqueror 3.x-文件大小视图仍未移植到KDE4。

'du -sh * | sort -h'在我的Linux(Centos发行版)机器上完美工作。谢谢!
pahariayogi

18

我将其用于当前目录下的前25名最严重的违规者

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

这个命令的技巧是找到一个似乎随着时间的推移而增加的隐藏文件夹。谢谢!
thegreendroid

以字节为单位吗?
用户

默认情况下,在我的系统上,“ du -S”给出了很好的人类可读输出。对于小文件,您将获得一个普通的字节数,对于大文件,您将获得一个带有'KB'或'MB'后缀的数字。
serg10

您可以执行du -Sh以获得可读的输出。
Siddhartha

@Siddhartha如果添加-h,则可能会更改sort -nr命令的效果-意味着排序将不再起作用,然后该head命令也将不再起作用
Clare Macrae

14

在以前的公司中,我们曾经做过一项cron作业,该作业会在一夜之间运行,并识别出一定大小的任何文件,例如

找到--size + 10000k

您可能希望对正在搜索的目录有更多选择,并注意任何可能脱机的远程安装驱动器。


您可以使用-x find选项,以确保在find命令的起点以外的其他设备上找不到文件。这解决了远程安装驱动器的问题。
rjmunro

10

一种选择是将您的du / sort命令作为cron作业运行,并输出到文件,因此在您需要时该文件已经存在。


9

对于命令行,我认为du / sort方法是最好的。如果您不在服务器上,则应查看Baobab-Disk使用情况分析器。该程序也需要一些时间才能运行,但是您可以轻松找到所有旧Linux ISO所在的子目录。


2
它还可以通过SSH,FTP,SMB和WebDAV扫描远程文件夹。

这很棒。使用GUI可以使某些东西更好地可视化,这就是其中之一!无论如何,我的服务器上都需要一个X服务器来进行CrashPlan,因此它也可以在该服务器上运行。
timelmer

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 -k可以绝对确定du使用的是KB单位
ndemou

关于-k的好主意。编辑。
Mark Borgerding

更简单,更可靠:(du -kx $2 | awk '$1>'$(($1*1024))如果您仅指定条件aka模式来默认默认操作是print $0
dave_thompson_085

好点@ date_thompson_085。对于我所知道的所有版本的awk(net / free-BSD和GNU)都是如此。@ mark-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 2016年

4

我喜欢旧的xdiskusage作为du(1)的图形替代。


注意问题的这一部分:“自...以来,我宁愿使用依赖于标准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

查看网站上的所有用法详细信息



2

您可以使用标准工具,如findsort分析你的磁盘空间使用情况。

列出按大小排序的目录

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

列出按文件大小排序的文件

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

1
我发现这是最好的答案,可以按顺序检测大尺寸
物体

2

也许值得一提的是mc(Midnight Commander,经典的文本模式文件管理器)默认仅显示目录索引节点的大小(通常为 4096),但是CtrlSpace通过菜单菜单“工具”或“菜单工具”,您都可以以人类可读的方式查看所选目录所占用的空间格式(例如 103151M)。

例如,下图显示了2018和2017的香草TeX Live发行版的完整大小,而2015和2016的版本仅显示了inode的大小(但实际上每个inode的大小都接近5 Gb)。

也就是说,CtrlSpace必须一对一地完成,仅针对实际目录级别,但是当您导航时它是如此的快捷方便mc,也许您将不需要ncdu(实际上,仅出于此目的更好)。否则,您也可以ncdu从运行mc。无需退出mc或启动另一个终端。

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的算术运算-使用AWK来代替:du -k | awk '$1 > 500000'。第一次尝试时,它更容易理解,编辑和正确。
ndemou

0

如果要提高速度,可以在要监视的文件系统上启用配额(无需为任何用户设置配额),并使用使用quota命令的脚本来列出每个用户正在使用的磁盘空间。例如:

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

会为您提供特定文件系统上特定用户的磁盘使用量(以块为单位)。这样,您应该可以在几秒钟内检查使用情况。

要启用配额,您需要在/ etc / fstab文件中的文件系统选项中添加usrquota,然后可能重新引导,以便可以在调用quotaon之前,在空闲的文件系统上运行quotecheck。


0

这是一个微型应用程序,它使用深度采样来查找任何磁盘或目录中的肿瘤。它遍历目录树两次,一次进行测量,第二次打印出目录下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%用于Intel Fortran编译器
  • 约有15%使用VS .NET 2003
  • VS 20占约20%

询问是否可以卸载其中的任何一个非常简单。

它还说明了在文件系统中分布的文件类型,但是在一起代表了节省空间的机会:

  • 约15%的文件会进入.cab和.MSI文件
  • 大约有10%用于记录文本文件

它还显示了很多其他我可能无法做到的事情,例如“ SmartDevices”和“ ce”支持(约15%)。

它确实需要线性时间,但是不必经常执行。

它发现的事例:

  • 许多保存的代码存储库中的DLL的备份副本,这些副本实际上并不需要保存
  • 某个目录下服务器上某人硬盘的备份副本
  • 大量的临时Internet文件
  • 远古的文档和帮助文件

0

我遇到了类似的问题,但是此页面上的答案还不够。我发现以下命令对清单最有用:

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

这将向我展示20个最大的罪犯。但是,即使我运行了此文件,它也没有显示出真正的问题,因为我已经删除了该文件。结果是,仍有一个进程正在运行,该进程正在引用已删除的日志文件...因此,我必须先终止该进程,然后磁盘空间显示为可用。


很好,但这应该是评论,而不是一个答案-这个问题的答案太多
ndemou

0

您可以使用DiskReport.net生成所有磁盘的在线Web报告。

经过多次运行,它将为您显示所有文件夹的历史记录图,轻松查找增长的趋势


该工具与“在分区已满后我经常发现自己
难以追究

0

有一个很好的跨平台免费软件,名为JDiskReport,其中包括一个GUI,用于探索占用所有空间的内容。

屏幕截图示例:
JDiskReport屏幕截图

当然,您需要手动清理一点空间,然后才能下载并安装它,或将其下载到其他驱动器(例如USB指驱动器)。


(这里复制了同一作者的答案上重复的问题)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.