在管理Linux系统时,我经常发现自己在分区已满后仍在努力寻找罪魁祸首。我通常使用,du / | sort -nr
但在大型文件系统上,这需要很长时间才能返回任何结果。
同样,这通常可以成功地突出显示最严重的罪犯,但我经常发现自己在du
没有sort
更微妙的情况下就诉诸于法律,然后不得不在输出中进行拖网捕捞。
我宁愿使用依赖于标准Linux命令的命令行解决方案,因为我必须管理很多系统,并且安装新软件很麻烦(尤其是在磁盘空间不足的情况下!)
在管理Linux系统时,我经常发现自己在分区已满后仍在努力寻找罪魁祸首。我通常使用,du / | sort -nr
但在大型文件系统上,这需要很长时间才能返回任何结果。
同样,这通常可以成功地突出显示最严重的罪犯,但我经常发现自己在du
没有sort
更微妙的情况下就诉诸于法律,然后不得不在输出中进行拖网捕捞。
我宁愿使用依赖于标准Linux命令的命令行解决方案,因为我必须管理很多系统,并且安装新软件很麻烦(尤其是在磁盘空间不足的情况下!)
Answers:
试试看ncdu
,一个出色的命令行磁盘使用分析器:
sudo apt install ncdu
在ubuntu上可以轻松获得它。太好了
ncdu -x
与要扫描的目录相同的文件系统上的文件和目录进行计数。
sudo ncdu -rx /
应该仅在根区域驱动器上对最大的目录/文件进行干净的读取。(-r
=只读,-x
=停留在同一文件系统上(意味着:不要遍历其他文件系统安装))
不要直接去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
查找正在占用磁盘的用户。
grep '[0-9]G'
包含很多误报,还省略了任何小数。这对我来说效果更好:sudo du -h / | grep -P '^[0-9\.]+G'
[GT]
不只是G
du -h | sort -hr | head
乍一看,请使用的“摘要”视图du
:
du -s /*
效果是打印其每个参数的大小,即上述情况下的每个根文件夹。
此外,GNUdu
和BSDdu
都可以进行深度限制(但是POSIX du
不能!):
GNU(Linux,…):
du --max-depth 3
BSD(macOS,…):
du -d 3
当然,这会将输出显示限制为深度3。计算和显示的大小仍然是整个深度的总和。但是,尽管如此,限制显示深度还是可以大大加快计算速度。
另一个有用的选择是-h
(在GNU和BSD上都使用单词,但同样,不是仅在POSIX上使用du
)用于“人类可读”输出(即,使用KiB,MiB 等)。
du
抱怨-d
尝试--max-depth 5
代替。
du -hd 1 <folder to inspect> | sort -hr | head
du --max-depth 5 -h /* 2>&1 | grep '[0-9\.]\+G' | sort -hr | head
过滤权限被拒绝
您还可以使用以下命令运行以下命令du
:
~# du -Pshx /* 2>/dev/null
-s
选项汇总并显示每个参数的总计。h
打印Mio,Gio等x
=停留在一个文件系统中(非常有用)。P
=不要遵循符号链接(例如,这可能导致文件被计数两次)。注意,该/root
目录不会显示,您必须运行该目录~# du -Pshx /root 2>/dev/null
(一次,我很努力地不指出/root
目录已满)。
编辑:更正的选项-P
du -Pshx .* * 2>/dev/null
+隐藏/系统目录
在文件系统上查找最大的文件总是需要很长时间。根据定义,您必须遍历整个文件系统以查找大文件。唯一的解决方案可能是在所有系统上运行cron作业,以提前准备好文件。
另一件事,du的x选项对于防止du跟随装入点进入其他文件系统很有用。即:
du -x [path]
我通常运行的完整命令是:
sudo du -xm / | sort -rn > usage.txt
该-m
方法以兆字节为单位返回结果,并将sort -rn
结果的最大数量排在最前面。然后,您可以在编辑器中打开usage.txt,最大的文件夹(以/开头)将位于顶部。
-x
旗帜!
ncdu
-至少比du
or 快find
(或取决于深度和论点)之类的工具花费的时间并不长
sudo du -xm / | sort -rn > ~/usage.txt
我总是使用du -sm * | sort -n
,它为您提供了当前工作目录的子目录用完了多少的排序列表,以兆字节为单位。
您也可以尝试使用Konqueror,它具有“大小视图”模式,类似于Windows上WinDirStat所做的工作:它可以直观地表示哪些文件/目录占用了您的大部分空间。
更新:在较新的版本上,您也可以使用du -sh * | sort -h
它将显示人类可读的文件大小并按这些大小排序。(数字后缀为K,M,G,...)
对于寻求替代KDE3的Konqueror文件大小视图的人们来说,可以看看filelight,尽管它并不那么好。
我将其用于当前目录下的前25名最严重的违规者
# -S to not include subdir size, sorted and limited to top 25
du -S . | sort -nr | head -25
-h
,则可能会更改sort -nr
命令的效果-意味着排序将不再起作用,然后该head
命令也将不再起作用
一种选择是将您的du / sort命令作为cron作业运行,并输出到文件,因此在您需要时该文件已经存在。
对于命令行,我认为du / sort方法是最好的。如果您不在服务器上,则应查看Baobab-Disk使用情况分析器。该程序也需要一些时间才能运行,但是您可以轻松找到所有旧Linux ISO所在的子目录。
我用
du -ch --max-depth=2 .
并根据自己的需要更改最大深度。“ c”选项打印文件夹的总计,“ h”选项打印适当的K,M或G大小。正如其他人所说,它仍然扫描所有目录,但是它以我发现更容易找到大目录的方式限制了输出。
尝试将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以上的目录。
du -k
可以绝对确定du使用的是KB单位
du -kx $2 | awk '$1>'$(($1*1024))
如果您仅指定条件aka模式来默认默认操作是print $0
)
du -kx / | awk '$1 > 500000'
du -kx / | tee /tmp/du.log | awk '$1 > 500000'
。这非常有帮助,因为如果您的第一个过滤结果无济于事,则可以尝试这样的其他值awk '$1 > 200000' /tmp/du.log
或检查这样的完整输出sort -nr /tmp/du.log|less
而无需重新扫描整个文件系统
这里没有提到,但是如果已删除/挂起文件,还应该检查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正常关闭自身。
在终端上,您可以使用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
查看网站上的所有用法详细信息
也许值得一提的是mc
(Midnight Commander,经典的文本模式文件管理器)默认仅显示目录索引节点的大小(通常为 4096
),但是CtrlSpace通过菜单菜单“工具”或“菜单工具”,您都可以以人类可读的方式查看所选目录所占用的空间格式(例如 103151M
)。
例如,下图显示了2018和2017的香草TeX Live发行版的完整大小,而2015和2016的版本仅显示了inode的大小(但实际上每个inode的大小都接近5 Gb)。
也就是说,CtrlSpace必须一对一地完成,仅针对实际目录级别,但是当您导航时它是如此的快捷方便mc
,也许您将不需要ncdu
(实际上,仅出于此目的更好)。否则,您也可以ncdu
从运行mc
。无需退出mc
或启动另一个终端。
如果您知道最近几天已经添加了大文件(例如3),则可以将find命令与“ ls -ltra
” 结合使用以发现那些最近添加的文件:
find /some/dir -type f -mtime -3 -exec ls -lart {} \;
这只会给你文件(“ -type f
”),而不是目录;仅对最近3天内具有修改时间的文件(“ -mtime -3
”)并对ls -lart
找到的每个文件(“ -exec
”部分)执行“ ” 。
要了解不成比例的磁盘空间使用情况,通常从根目录开始并逐步遍历其最大的子目录通常很有用。
我们可以做到这一点
那是:
# 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
等等...
我已使用此命令查找大于100Mb的文件:
find / -size +100M -exec ls -l {} \;
如果要提高速度,可以在要监视的文件系统上启用配额(无需为任何用户设置配额),并使用使用quota命令的脚本来列出每个用户正在使用的磁盘空间。例如:
quota -v $user | grep $filesystem | awk '{ print $2 }'
会为您提供特定文件系统上特定用户的磁盘使用量(以块为单位)。这样,您应该可以在几秒钟内检查使用情况。
要启用配额,您需要在/ etc / fstab文件中的文件系统选项中添加usrquota,然后可能重新引导,以便可以在调用quotaon之前,在空闲的文件系统上运行quotecheck。
这是一个微型应用程序,它使用深度采样来查找任何磁盘或目录中的肿瘤。它遍历目录树两次,一次进行测量,第二次打印出目录下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,其中
询问是否可以卸载其中的任何一个非常简单。
它还说明了在文件系统中分布的文件类型,但是在一起代表了节省空间的机会:
它还显示了很多其他我可能无法做到的事情,例如“ SmartDevices”和“ ce”支持(约15%)。
它确实需要线性时间,但是不必经常执行。
它发现的事例:
有一个很好的跨平台免费软件,名为JDiskReport,其中包括一个GUI,用于探索占用所有空间的内容。
当然,您需要手动清理一点空间,然后才能下载并安装它,或将其下载到其他驱动器(例如USB指驱动器)。
(这里复制了同一作者的答案上重复的问题)