没有更多的磁盘空间:如何找到占用空间的内容?

Kar*_*son 131 disk-usage

我在一台运行 16.04 的服务器上遇到了一个问题:没有剩余的磁盘空间。

我不知道是什么占用了空间。是否有命令列出当前目录大小,以便我可以遍历并最终进入占用所有空间的目录?

Top*_*Hat 162

与在 Linux 中一样,完成工作的方法不止一种。但是,如果您需要从 CLI 执行此操作,这是我的首选方法:

我首先以 root 身份或使用 sudo 运行它:

du -cha --max-depth=1 / | grep -E "M|G"
Run Code Online (Sandbox Code Playgroud)

grep 将返回行限制为返回值在兆字节或千兆字节范围内的行。如果您的磁盘足够大,您也可以添加|T以包含 TB 数量。您可能会在/proc/sys和/ 或/dev因为它们不是磁盘上的真实文件而遇到一些错误。但是,它仍然应该为 root 中的其余目录提供有效的输出。在找到最大的那些之后,您可以在该目录中运行该命令,以缩小罪魁祸首的范围。因此,例如,如果/var是最大的,你可以这样做:

du -cha --max-depth=1 /var | grep -E "M|G"
Run Code Online (Sandbox Code Playgroud)

那应该把你引向问题儿童!

其他注意事项

虽然上面的命令肯定会奏效,但我在下面的评论中提出了一些建设性的批评,指出了一些你也可以包括的内容。

  1. grep如果目录或文件的名称有大写的 G 或 M ,我提供的可能会导致偶尔返回“K”值。您的正则表达式游戏更具创意和复杂性。例如grep -E "^[0-9\.]*[MG]"
  2. 如果您知道哪个驱动器有问题,并且它上面有其他已安装的驱动器,您不想浪费时间(包括在搜索中),则可以将该-x标志添加到您的du命令中。该标志的手册页描述:

      -x, --one-file-system
          skip directories on different file systems
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您可以对du命令的输出进行排序,以便最大值位于底部。只需将此附加到命令的末尾:| sort -h

  • 您的 grep 也会返回名称中包含字母 M 或 G 的任何文件夹,创意正则表达式应该使用可选的点 + M|G 命中数字,也许是 `"^[0-9]*[.]*[0-9] *[MG]"` (5认同)
  • 如果您知道这是一个驱动器的问题,您可以使用 `-x` 选项让 `du` 留在那个驱动器上(在命令行中提供)。您还可以通过 `sort -h` 管道正确排序兆字节/千兆字节人类可读值。我通常会忽略`--max-depth` 选项,而是以这种方式搜索整个驱动​​器,适当排序以获取底部最大的内容。 (4认同)
  • 这正是我所做的。 (2认同)

Dun*_*can 106

您可以ncdu为此使用。它运作良好。

sudo apt install ncdu
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 我正在踢自己,因为我实际上通常使用这个程序,但是由于没有剩余空间我无法安装它哈哈 (48认同)
  • 安装后,从命令行输入“sudo ncdu /”。`sudo` 因为如果你不输入 sudo,它不会报告 root 拥有的文件夹的大小,而 `/` 因为如果你不输入它,它只会从你所在的文件夹中递归地报告 (3认同)

Cha*_*een 21

我使用这个命令:

sudo du -aBM -d 1 . | sort -nr | head -20
Run Code Online (Sandbox Code Playgroud)

有时,我需要从/目录中运行它,因为我将某些东西放在了一个奇怪的位置。


小智 14

关于找到哪些目录占用大部分空间的方法,已经有很多很好的答案。如果您有理由相信几个大文件是主要问题,而不是许多小文件,您可以使用以下内容:

find / -size +10M
Run Code Online (Sandbox Code Playgroud)


Gab*_*iel 13

如果您也不想使用命令,这里有一个应用程序:Filelight

它使您可以快速查看任何文件夹中正在使用磁盘空间的内容。

在此处输入图片说明


mir*_*173 12

我不知道 Ubuntu 并且无法检查我的答案,但是根据我很久以前作为 unix 管理员的经验在这里发布我的答案。

  1. 找出哪个文件系统空间不足

    df -h
    
    Run Code Online (Sandbox Code Playgroud)

    将列出所有文件系统、它们的大小和它们的可用空间。如果您调查具有足够空间的文件系统,您只会浪费时间。假设完整的文件系统是 /myfilesystem。如果 /myfilesystems 的子目录上安装了文件系统,请检查 df 输出。如果是这样,以下规格必须适应这种情况。

  2. 找出这个文件系统的文件使用了多少空间

    du -sh /myfilesystem
    
    Run Code Online (Sandbox Code Playgroud)

    -x 选项可用于保证仅考虑作为此文件系统成员的文件。某些 Unix 变体(例如 Solaris)不知道 du 的 -x 选项。然后你必须使用一些解决方法来找到你的文件系统的 du。

  3. 现在检查可见文件的 du 是否大约是 df 显示的已用空间的大小。如果是这样,您可以开始查找 /myfilesystem 文件系统的大文件/目录进行清理。

  4. 查找目录的最大子目录 /.../dir 使用

    du -sk /.../dir/*|sort -n
    
    Run Code Online (Sandbox Code Playgroud)

    -k 选项强制 du 以千字节为单位输出 sie,没有任何单位。这可能是某些系统上的默认设置。然后你可以省略这个选项。最大的文件/子目录将显示在输出的底部。

  5. 如果您发现不再需要的大文件/目录,您可以以适当的方式将其删除。不要理会输出顶部的小目录。如果你删除它们,它不会解决你的问题。如果您仍然没有足够的空间,则可以在列表底部显示的 larges 子目录中重复步骤 4。

但是如果 du 输出不是 df 显示的可用空间,会发生什么?

如果 du 输出较大,则您错过了安装另一个文件系统的子目录。如果 du 输出小得多,那么在 du 检查的任何目录中都不会显示 som 文件。他的现象可能有不同的原因。

  1. 某些进程正在使用已删除的文件。因此,这些文件已从目录中删除,du 看不到它们。但是对于文件系统,它们的块仍在使用中,直到进程关闭文件。您可以尝试找出相关进程(例如使用 lsof)并强制它们关闭此文件(例如通过停止应用程序或通过终止进程)。或者您只需重新启动机器。

  2. 目录中的文件不再可见,因为在其父目录之一上安装了另一个文件系统。因此,如果您有一个文件 /myfilesysem/subdir/bigfile 并且现在在 /myfilesystem/subdir 上挂载另一个文件系统,那么您将无法再看到该文件并且

    du -shx /myfilesystem 
    
    Run Code Online (Sandbox Code Playgroud)

    将报告一个不包含 /myfilesystem/subdir/bigfile 大小的值。找出此类文件是否存在的唯一方法是卸载 /myfilesystem/subir 并检查

    ls -la /myfilesystem/subdir 
    
    Run Code Online (Sandbox Code Playgroud)

    如果它包含文件。

  3. 可能有特殊类型的文件系统使用/保留磁盘上的空间对 ls 命令不可见。您需要特殊的工具来显示它。

除了这种使用 du 命令的系统方法之外,您还可以使用其他一些方法。因此,您可以使用 find 命令查找大于您提供的某个值的文件,您可以搜索大于您提供的某个值或新创建的或具有特殊名称的文件(例如 *.log、core、* .trc)。但是你总是应该像 1 中描述的那样做一个 df 以便你在正确的文件系统上工作


phu*_*clv 5

我经常用这个

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

然后,如果我发现一些大文件夹,我会切换到它并进行进一步调查

cd big_dir
du -sh */
Run Code Online (Sandbox Code Playgroud)

如果需要,您还可以使其自动排序

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