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

669 command-line partition disk-usage command

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

此外,这通常可以成功地突出显示最严重的罪犯,但我经常发现自己 在更微妙的情况下诉诸于du没有sort,然后不得不浏览输出。

我更喜欢依赖于标准 Linux 命令的命令行解决方案,因为我必须管理相当多的系统并且安装新软件很麻烦(尤其是在磁盘空间不足时!)

小智 867

Try ncdu,一个优秀的命令行磁盘使用分析器:

在此处输入图片说明

  • 通常,我讨厌被要求安装一些东西来解决一个简单的问题,但这很好。 (38认同)
  • `sudo apt install ncdu` 在 ubuntu 上很容易得到。这很棒 (30认同)
  • 我的空间太小,无法安装 ncdu (28认同)
  • 最佳答案。另外:`sudo ncdu -rx /` 应该只在根区域驱动器上对最大的目录/文件进行干净的读取。(`-r` = 只读,`-x` = 留在同一个文件系统上(意思是:不遍历其他文件系统挂载)) (22认同)
  • 您很可能知道哪个文件系统空间不足。在这种情况下,您可以使用 `ncdu -x` 仅对与被扫描目录相同的文件系统上的文件和目录进行计数。 (12认同)
  • 错误,无法安装 ncdu,E:您在 /var/cache/apt/archives/ 中没有足够的可用空间。:( (5认同)
  • 没有空间,没问题:`sudo mkdir /ncdu && sudo mount -t tmpfs -o size=500m tmpfs /ncdu && wget -qO- https://dev.yorhel.nl/download/ncdu-linux-x86_64-1.16。 .tar.gz | tar xvz --目录 /ncdu && /ncdu/ncdu -x` (4认同)
  • 没有空间,没有 sudo,没问题:`wget -qO- https://dev.yorhel.nl/download/ncdu-linux-x86_64-1.16.tar.gz | tar xvz --directory /dev/shm && /dev/shm/ncdu -x` ... url 可能会更改,可能会提供更新的版本,请参阅此处:https://dev.yorhel.nl/ncdu (4认同)
  • 问题是...磁盘空间不足,因此无法安装另一个依赖项:) (2认同)
  • 浏览磁盘使用情况时按 r 会刷新当前目录 (2认同)

Ben*_*ins 369

不要直接去du /。使用df来找到伤害你的分区,然后尝试du命令。

我喜欢尝试的一个是

# U.S.
du -h <dir> | grep '[0-9\.]\+G'
# Others
du -h <dir> | grep '[0-9\,]\+G'
Run Code Online (Sandbox Code Playgroud)

因为它以“人类可读的形式”打印尺寸。除非您的分区非常小,否则以 GB 为单位搜索目录是您想要的非常好的过滤器。这将花费您一些时间,但除非您设置了配额,否则我认为这就是它的方式。

正如@jchavannes 在评论中指出的那样,如果您发现太多误报,表达式会变得更加精确。我采纳了这个建议,这确实使它变得更好,但仍然存在误报,所以只有权衡(更简单的 expr,更糟糕的结果;更复杂和更长的 expr,更好的结果)。如果您的输出中出现太多小目录,请相应地调整您的正则表达式。例如,

grep '^\s*[0-9\.]\+G'
Run Code Online (Sandbox Code Playgroud)

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

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

quota -v
Run Code Online (Sandbox Code Playgroud)

查找占用磁盘的用户。

  • `grep '[0-9]G'` 包含很多误报并且还省略了任何小数。这对我来说效果更好:`sudo du -h / | grep -P '^[0-9\.]+G'` (26认同)
  • 我喜欢使用`du -h | 排序 -hr | 头` (26认同)
  • 如果你有非常大的目录,你会想要`[GT]` 而不仅仅是`G` (3认同)
  • 这是非常快速、简单和实用的 (2认同)

Kon*_*lph 117

首先,使用 的“摘要”视图du

du -s /*
Run Code Online (Sandbox Code Playgroud)

效果是打印其每个参数的大小,即上面案例中的每个根文件夹。

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

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

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

  • 如果 `du` 抱怨 `-d`,请尝试使用 `--max-depth 5`。 (24认同)
  • 伟大的回答者。对我来说似乎是正确的。我建议`du -hcd 1 /directory`。-h 为人类可读,c 为总和 d 为深度。 (8认同)

小智 57

您还可以使用以下命令运行以下命令du

~# du -Pshx /* 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
  • -s选项总结并显示每个参数的总数。
  • h 打印 Mio、Gio 等。
  • x = 留在一个文件系统中(非常有用)。
  • P = 不要遵循符号链接(例如,这可能导致文件被计算两次)。

小心,/root目录不会显示,你必须运行~# du -Pshx /root 2>/dev/null才能得到它(有一次,我挣扎了很多,没有指出我的/root目录已经满了)。

编辑:更正选项 -P

  • `du -Pshx .* * 2&gt;/dev/null` + 隐藏/系统目录 (2认同)

rjm*_*nro 29

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

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

du -x [path]
Run Code Online (Sandbox Code Playgroud)

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

sudo du -xm / | sort -rn > usage.txt
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢您指出 `-x` 标志! (4认同)

小智 22

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

您还可以尝试 Konqueror,它具有“大小视图”模式,类似于 Windows 上的 WinDirStat:它为您提供了哪些文件/目录占用了大部分空间的可视化表示。

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

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


小智 20

我将它用于当前目录下的前 25 个最坏的罪犯

# -S to not include subdir size, sorted and limited to top 25
du -S . | sort -nr | head -25
Run Code Online (Sandbox Code Playgroud)


小智 14

在以前的一家公司,我们曾经有一个 cron 作业,它会在一夜之间运行并识别出超过一定大小的任何文件,例如

find / -size +10000k
Run Code Online (Sandbox Code Playgroud)

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


小智 11

一种选择是将 du/sort 命令作为 cron 作业运行,然后输出到文件,以便在您需要时它已经存在。


小智 11

我用

du -ch --max-depth=2 .
Run Code Online (Sandbox Code Playgroud)

我改变了最大深度以满足我的需要。“c”选项打印文件夹的总数,“h”选项根据需要打印 K、M 或 G 的大小。正如其他人所说,它仍然扫描所有目录,但它以一种我发现更容易找到大目录的方式限制了输出。


Pet*_*and 9

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

  • 它还可以通过 SSH、FTP、SMB 和 WebDAV 扫描远程文件夹。 (2认同)

der*_*ert 9

我要第二xdiskusage。但是我要在注释中添加它实际上是一个 du 前端并且可以从文件中读取 du 输出。所以你可以du -ax /home > ~/home-du在你的服务器上运行,scp返回文件,然后以图形方式分析它。或者通过 ssh 进行管道传输。


Fra*_*ran 7

也许值得注意的是mc(Midnight Commander,一个经典的文本模式文件管理器)默认情况下仅显示目录 inode 的大小(通常 4096),但是使用CtrlSpace或使用菜单工具,您可以以人类可读的方式查看所选目录占用的空间格式(例如,有些像 103151M)。

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

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

姆韦


Mar*_*ing 6

尝试将 du 的输出输入到一个简单的 awk 脚本中,该脚本检查目录的大小是否大于某个阈值,如果是,则将其打印出来。在开始获取信息之前,您不必等待遍历整个树(与许多其他答案相比)。

例如,以下显示占用超过 500 MB 的任何目录。

du -kx / | awk '{ if ($1 > 500000) { print $0} }'
Run Code Online (Sandbox Code Playgroud)

为了使上述内容更可重用,您可以在 .bashrc 中定义一个函数,(或者您可以将其变成一个独立的脚本)。

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

因此dubig 200 ~/,在主目录下(不遵循设备外的符号链接)查找使用超过 200 MB 的目录。


cme*_*oli 5

我更喜欢使用以下内容来获得概述并从那里深入......

cd /folder_to_check
du -shx */
Run Code Online (Sandbox Code Playgroud)

这将显示具有人类可读输出(例如 GB、MB)的结果。它还将防止遍历远程文件系统。该-s选项仅显示找到的每个文件夹的摘要,因此如果您对文件夹的更多详细信息感兴趣,则可以进一步深入研究。请记住,此解决方案只会显示文件夹,因此如果您也需要文件,则需要省略星号后的 /。


小智 5

此处未提及,但您还应该检查 lsof 以防删除/挂起文件。我从失控的 cronjob 中删除了 5.9GB 的 tmp 文件。

https://serverfault.com/questions/207100/how-can-i-find-phantom-storage-usage帮助我找到了所述文件( cron )的进程所有者,然后我能够/proc/{cron id}/fd/{file handle #}减少文件问题开始逃跑,解决这个问题,然后 echo "" > file 清理空间,让 cron 优雅地关闭自己。