Karl Morrison Asked: 2017-05-05 07:21:44 +0800 CST2017-05-05 07:21:44 +0800 CST 2017-05-05 07:21:44 +0800 CST 没有更多的磁盘空间:如何找到占用空间的内容? 772 我在其中一台运行 16.04 的服务器上遇到了问题:没有剩余磁盘空间。 我不知道是什么占用了空间。是否有列出当前目录大小的命令,以便我可以遍历并最终进入占用所有空间的目录? disk-usage 13 个回答 Voted Best Answer TopHat 2017-05-05T07:36:51+08:002017-05-05T07:36:51+08:00 与 Linux 中的往常一样,完成工作的方法不止一种。但是,如果您需要从 CLI 执行此操作,这是我的首选方法: 我首先以 root 或 sudo 运行它: du -cha --max-depth=1 / | grep -E "M|G" grep 将返回行限制为返回值在兆字节或千兆字节范围内的行。如果您的磁盘足够大,您也可以添加|T包括太字节的数量。/proc您可能会在、/sys和/或上遇到一些错误,/dev因为它们不是磁盘上的真实文件。但是,它仍应为 root 中的其余目录提供有效输出。在找到最大的那些之后,您可以在该目录中运行命令以缩小罪魁祸首。因此,例如,如果/var是最大的,您接下来可以这样做: du -cha --max-depth=1 /var | grep -E "M|G" 那应该把你引向问题儿童! 其他注意事项 虽然上面的命令肯定可以解决问题,但我在下面的评论中提出了一些建设性的批评,指出了一些你也可以包括在内的东西。 如果目录或文件的名称具有大写字母 G 或 M ,grep则 I 提供的可能会导致偶尔返回“K”值。如果您绝对不希望显示任何 K 值目录,则您需要向上您的正则表达式游戏更具创造性和复杂性。例如grep -E "^[0-9\.]*[MG]" 如果您知道哪个驱动器是问题所在,并且它上面还有其他安装的驱动器,您不想浪费时间包括在搜索中,您可以将-x标志添加到您的du命令中。该标志的手册页描述: -x, --one-file-system skip directories on different file systems 您可以对命令的输出进行排序,du使最大值位于底部。只需将其附加到命令的末尾:| sort -h Duncan 2017-05-05T07:28:38+08:002017-05-05T07:28:38+08:00 你可以用ncdu这个。它工作得很好。 sudo apt install ncdu Charles Green 2017-05-05T07:25:29+08:002017-05-05T07:25:29+08:00 我使用这个命令: sudo du -aBM -d 1 . | sort -nr | head -20 有时,我需要从/目录中运行它,因为我在一个奇怪的位置放置了一些东西。 Luca Citi 2017-05-05T12:21:18+08:002017-05-05T12:21:18+08:00 关于查找哪些目录占用大部分空间的方法,已经有很多很好的答案。如果您有理由相信一些大文件是主要问题,而不是许多小文件,您可以使用以下内容: find / -size +10M Gabriel 2017-05-06T13:32:14+08:002017-05-06T13:32:14+08:00 如果您也对不使用命令感兴趣,这里有一个应用程序:Filelight 它使您可以快速可视化任何文件夹中正在使用的磁盘空间。 miracle173 2017-05-05T23:12:37+08:002017-05-05T23:12:37+08:00 我不了解 Ubuntu,也无法检查我的答案,但根据我很久以前作为 unix 管理员的经验在此处发布我的答案。 找出哪个文件系统空间不足 df -h 将列出所有文件系统、它们的大小和可用空间。如果您调查有足够空间的文件系统,您只会浪费时间。假设完整的文件系统是 /myfilesystem。如果 /myfilesystems 的子目录上挂载了文件系统,请检查 df 输出。如果是这样,则必须对以下 speps 进行调整以适应这种情况。 找出这个文件系统的文件使用了多少空间 du -sh /myfilesystem -x 选项可用于保证仅考虑属于此文件系统成员的文件。某些 Unix 变体(例如 Solaris)不知道 du 的 -x 选项。然后你必须使用一些变通方法来找到你的文件系统的 du。 现在检查可见文件的 du 是否大约是 df 显示的已用空间的大小。如果是这样,您可以开始查找 /myfilesystem 文件系统的大文件/目录进行清理。 查找目录的最大子目录 /.../dir 使用 du -sk /.../dir/*|sort -n -k 选项强制 du 以千字节为单位输出 sie,不带任何单位。这可能是某些系统的默认设置。然后你可以省略这个选项。最大的文件/子目录将显示在输出的底部。 如果您发现不再需要的大文件/目录,您可以通过适当的方式将其删除。不要担心输出顶部的小目录。如果您删除它们,它不会解决您的问题。如果您仍然没有足够的空间,您可以在列表底部显示的 larges 子目录中重复步骤 4。 但是,如果 du 输出不是 df 显示的大约可用空间,会发生什么? 如果 du 输出较大,则您错过了安装另一个文件系统的子目录。如果 du 输出小得多,则 som 文件不会显示在 du 检查的任何目录中。他的现象可能有不同的原因。 某些进程正在使用已删除的文件。因此,这些文件已从目录中删除,du 看不到它们。但是对于文件系统,它们的块仍在使用中,直到进程关闭文件。您可以尝试找出相关进程(例如使用 lsof)并强制它们关闭此文件(例如通过停止应用程序或终止进程)。或者您只需重新启动机器。 目录中的文件不再可见,因为在其父目录之一上安装了另一个文件系统。因此,如果您有一个文件 /myfilesysem/subdir/bigfile 并且现在在 /myfilesystem/subdir 上挂载另一个文件系统,那么您将无法再看到该文件并且 du -shx /myfilesystem 将报告一个不包含 /myfilesystem/subdir/bigfile 大小的值。找出此类文件是否存在的唯一方法是卸载 /myfilesystem/subir 并检查 ls -la /myfilesystem/subdir 如果它包含文件。 可能有特殊类型的文件系统使用/保留磁盘上对 ls 命令不可见的空间。你需要特殊的工具来显示它。 除了这种使用 du 命令的系统方法之外,您还可以使用其他一些方法。因此,您可以使用 find 命令查找大于您提供的某个值的文件,您可以搜索大于您提供的某个值或新创建或具有特殊名称的文件(例如 *.log、core、* .trc)。但是你总是应该按照 1 中的描述做一个 df 以便你在正确的文件系统上工作 phuclv 2017-05-05T19:05:34+08:002017-05-05T19:05:34+08:00 我经常用这个 du -sh /*/ 然后,如果我找到一些大文件夹,我会切换到它并做进一步调查 cd big_dir du -sh */ 如果需要,您还可以使用 du -s /*/ | sort -n Donald Shahini 2017-05-06T04:36:50+08:002017-05-06T04:36:50+08:00 sudo apt-get autoremove如果您还没有这样做,请尝试删除未使用的文件 Criggie 2017-05-05T21:11:41+08:002017-05-05T21:11:41+08:00 不是真正的答案-而是附录。 您空间有限,无法从@erman 的回答中安装 ncdu。 一些建议 sudo apt clean all删除您已经下载的软件包。安全的 sudo rm -f /var/log/*gz清除一两周前的日志文件 - 不会删除较新/当前的日志。最安全 sudo lsof | grep deleted列出所有打开的文件,但过滤到已从磁盘中删除的文件。相当安全 sudo rm /tmp/*删除一些临时文件——如果有东西在使用它们,你可能会扰乱进程。不那么安全 `lsof one 可能会返回如下行: server456 ~ $ lsof | grep deleted init 1 root 9r REG 253,0 10406312 3104 /var/lib/sss/mc/initgro ups (deleted) salt-mini 4532 root 0r REG 253,0 17 393614 /tmp/sh-thd-1492991421 (deleted) 不能为 init 行做太多,但第二行表明 salt-minion 有一个打开的文件被删除,一旦服务重启关闭所有文件句柄,将返回磁盘块。 这里的其他常见嫌疑人包括 syslog / rsyslog / syslog-ng、squid、apache 或您的服务器运行的任何“重”进程。 Matteo Italia 2017-05-07T08:57:53+08:002017-05-07T08:57:53+08:00 我发现像 Filelight 这样的工具的输出特别有价值,但是,在您的情况下,在服务器上通常没有安装 GUI,但该du命令始终可用。 我通常做的是: 将du输出写入文件 ( du / > du_output.txt); 将文件复制到我的机器上; 用于DuFS将输出“挂载”到du临时目录中;DuFS根据输出使用 FUSE 创建一个虚拟文件系统(= 没有实际创建文件,都是假的)du; 在这个临时目录上运行 Filelight 或其他 GUI 工具。 免责声明:我写了dufs- 正是因为我经常需要找出无头机器上占用磁盘空间的原因。
与 Linux 中的往常一样,完成工作的方法不止一种。但是,如果您需要从 CLI 执行此操作,这是我的首选方法:
我首先以 root 或 sudo 运行它:
grep 将返回行限制为返回值在兆字节或千兆字节范围内的行。如果您的磁盘足够大,您也可以添加
|T
包括太字节的数量。/proc
您可能会在、/sys
和/或上遇到一些错误,/dev
因为它们不是磁盘上的真实文件。但是,它仍应为 root 中的其余目录提供有效输出。在找到最大的那些之后,您可以在该目录中运行命令以缩小罪魁祸首。因此,例如,如果/var
是最大的,您接下来可以这样做:那应该把你引向问题儿童!
其他注意事项
虽然上面的命令肯定可以解决问题,但我在下面的评论中提出了一些建设性的批评,指出了一些你也可以包括在内的东西。
grep
则 I 提供的可能会导致偶尔返回“K”值。如果您绝对不希望显示任何 K 值目录,则您需要向上您的正则表达式游戏更具创造性和复杂性。例如grep -E "^[0-9\.]*[MG]"
如果您知道哪个驱动器是问题所在,并且它上面还有其他安装的驱动器,您不想浪费时间包括在搜索中,您可以将
-x
标志添加到您的du
命令中。该标志的手册页描述:您可以对命令的输出进行排序,
du
使最大值位于底部。只需将其附加到命令的末尾:| sort -h
你可以用
ncdu
这个。它工作得很好。我使用这个命令:
有时,我需要从
/
目录中运行它,因为我在一个奇怪的位置放置了一些东西。关于查找哪些目录占用大部分空间的方法,已经有很多很好的答案。如果您有理由相信一些大文件是主要问题,而不是许多小文件,您可以使用以下内容:
如果您也对不使用命令感兴趣,这里有一个应用程序:Filelight
它使您可以快速可视化任何文件夹中正在使用的磁盘空间。
我不了解 Ubuntu,也无法检查我的答案,但根据我很久以前作为 unix 管理员的经验在此处发布我的答案。
找出哪个文件系统空间不足
将列出所有文件系统、它们的大小和可用空间。如果您调查有足够空间的文件系统,您只会浪费时间。假设完整的文件系统是 /myfilesystem。如果 /myfilesystems 的子目录上挂载了文件系统,请检查 df 输出。如果是这样,则必须对以下 speps 进行调整以适应这种情况。
找出这个文件系统的文件使用了多少空间
-x 选项可用于保证仅考虑属于此文件系统成员的文件。某些 Unix 变体(例如 Solaris)不知道 du 的 -x 选项。然后你必须使用一些变通方法来找到你的文件系统的 du。
现在检查可见文件的 du 是否大约是 df 显示的已用空间的大小。如果是这样,您可以开始查找 /myfilesystem 文件系统的大文件/目录进行清理。
查找目录的最大子目录 /.../dir 使用
-k 选项强制 du 以千字节为单位输出 sie,不带任何单位。这可能是某些系统的默认设置。然后你可以省略这个选项。最大的文件/子目录将显示在输出的底部。
如果您发现不再需要的大文件/目录,您可以通过适当的方式将其删除。不要担心输出顶部的小目录。如果您删除它们,它不会解决您的问题。如果您仍然没有足够的空间,您可以在列表底部显示的 larges 子目录中重复步骤 4。
但是,如果 du 输出不是 df 显示的大约可用空间,会发生什么?
如果 du 输出较大,则您错过了安装另一个文件系统的子目录。如果 du 输出小得多,则 som 文件不会显示在 du 检查的任何目录中。他的现象可能有不同的原因。
某些进程正在使用已删除的文件。因此,这些文件已从目录中删除,du 看不到它们。但是对于文件系统,它们的块仍在使用中,直到进程关闭文件。您可以尝试找出相关进程(例如使用 lsof)并强制它们关闭此文件(例如通过停止应用程序或终止进程)。或者您只需重新启动机器。
目录中的文件不再可见,因为在其父目录之一上安装了另一个文件系统。因此,如果您有一个文件 /myfilesysem/subdir/bigfile 并且现在在 /myfilesystem/subdir 上挂载另一个文件系统,那么您将无法再看到该文件并且
将报告一个不包含 /myfilesystem/subdir/bigfile 大小的值。找出此类文件是否存在的唯一方法是卸载 /myfilesystem/subir 并检查
如果它包含文件。
可能有特殊类型的文件系统使用/保留磁盘上对 ls 命令不可见的空间。你需要特殊的工具来显示它。
除了这种使用 du 命令的系统方法之外,您还可以使用其他一些方法。因此,您可以使用 find 命令查找大于您提供的某个值的文件,您可以搜索大于您提供的某个值或新创建或具有特殊名称的文件(例如 *.log、core、* .trc)。但是你总是应该按照 1 中的描述做一个 df 以便你在正确的文件系统上工作
我经常用这个
然后,如果我找到一些大文件夹,我会切换到它并做进一步调查
如果需要,您还可以使用
sudo apt-get autoremove
如果您还没有这样做,请尝试删除未使用的文件不是真正的答案-而是附录。
您空间有限,无法从@erman 的回答中安装 ncdu。
一些建议
sudo apt clean all
删除您已经下载的软件包。安全的sudo rm -f /var/log/*gz
清除一两周前的日志文件 - 不会删除较新/当前的日志。最安全sudo lsof | grep deleted
列出所有打开的文件,但过滤到已从磁盘中删除的文件。相当安全sudo rm /tmp/*
删除一些临时文件——如果有东西在使用它们,你可能会扰乱进程。不那么安全`lsof one 可能会返回如下行:
不能为 init 行做太多,但第二行表明 salt-minion 有一个打开的文件被删除,一旦服务重启关闭所有文件句柄,将返回磁盘块。
这里的其他常见嫌疑人包括 syslog / rsyslog / syslog-ng、squid、apache 或您的服务器运行的任何“重”进程。
我发现像 Filelight 这样的工具的输出特别有价值,但是,在您的情况下,在服务器上通常没有安装 GUI,但该
du
命令始终可用。我通常做的是:
du
输出写入文件 (du / > du_output.txt
);DuFS
将输出“挂载”到du
临时目录中;DuFS
根据输出使用 FUSE 创建一个虚拟文件系统(= 没有实际创建文件,都是假的)du
;免责声明:我写了
dufs
- 正是因为我经常需要找出无头机器上占用磁盘空间的原因。