十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux磁盘空间排查:find、du、sort命令组合定位与清理大文件

Linux磁盘空间排查:find、du、sort命令组合定位与清理大文件 1. 项目概述定位与清理Linux系统中的“空间杀手”在Linux服务器运维或者日常桌面使用中你是否遇到过这样的场景系统盘空间莫名其妙就告急了df -h命令显示某个分区使用率飙到了95%以上系统开始报警甚至影响到应用的正常运行。这时候第一反应往往是“到底是什么东西占用了这么多空间”这个问题看似简单但面对动辄几十万甚至上百万文件的复杂目录树手动去翻找无异于大海捞针。我处理过太多因为日志文件无限增长、临时文件未清理、错误上传了大体积媒体文件而导致的服务故障。快速、精准地定位到系统中的“大文件”是每个Linux使用者尤其是运维和开发人员必须掌握的核心技能。今天要聊的就是如何组合使用find、du、sort这几个看似基础实则威力强大的命令来一场高效的“磁盘空间大扫除”。这不仅仅是几个命令的简单罗列而是一套从快速扫描到精准定位再到安全清理的完整工作流。掌握了它你就能在几分钟内揪出那些隐藏在角落里的“空间杀手”让磁盘管理变得清晰、可控。2. 核心工具解析find、du与sort的职责与协作在开始实战前我们必须先理解手中这几个“工具”各自擅长什么以及它们如何配合。很多新手会混淆find和du觉得它们都能找文件但实际上它们的计算逻辑和适用场景有本质区别。2.1 find命令基于元数据的精准过滤器find命令的核心工作是遍历目录树并根据你设定的条件如文件名、类型、大小、时间等来筛选出符合条件的文件路径。它的“查找”是基于文件的元数据metadata也就是存储在文件系统索引节点inode里的信息例如文件大小、修改时间、权限等。find本身并不直接计算目录的累积大小。关键选项解析-type f这是最常用的条件之一限定只查找普通文件file排除目录、符号链接等。在搜索大文件时我们通常只关心实实在在的数据文件。-size这是本次任务的核心。其参数格式非常灵活且强大100M查找大小大于100MB的文件。-100M查找大小小于100MB的文件。100M查找大小等于100MB的文件几乎不用因为不精确。单位支持c字节k千字节M兆字节G吉字节。注意find默认的-size单位是512-byte blocks这是一个历史遗留的易错点因此强烈建议始终显式指定单位如M或G。一个重要的坑find -size判断大小时对于和-是“四舍五入”到指定单位的。例如-size 100M会找到大小大于104,857,600字节100 * 1024 * 1024的文件。一个 104,857,599 字节的文件不会被匹配。理解这一点对于精确筛选很重要。2.2 du命令计算磁盘使用量的专家dudisk usage命令的核心工作是计算文件或目录所占用的实际磁盘空间。这个“实际空间”可能因为文件系统块大小、稀疏文件、硬链接等因素与文件的“逻辑大小”略有不同。du是真正去统计数据块使用情况的。关键选项解析-a或--all为每个文件显示磁盘使用情况而不仅仅是目录。这是让它能像find一样列出每个文件的关键。-h或--human-readable以人类易读的形式K, M, G显示大小这是必备选项否则你会看到一长串字节数。-s或--summarize仅显示参数指定项目的总用量常用于快速查看某个目录的总大小。--max-depthN控制遍历的深度非常有用。例如du -h --max-depth1 /home可以快速查看/home下每个一级子目录的大小。与find的根本区别du计算的是累积空间。对一个目录执行du得到的是该目录下所有文件大小的总和。而find只是列出符合条件的单个文件。如果你想找“哪个目录最占空间”du更合适如果想找“具体是哪个大文件”则需要find或du -a。2.3 sort命令给结果排个序当我们用find或du -a找出一堆文件后列表可能是杂乱无章的。sort命令就是来帮我们整理结果的尤其是按文件大小排序一眼就能看到最大的那几个。关键选项解析用于排序大小-h或--human-numeric-sort这是按人类可读大小如2K, 1G排序的秘诀。普通的数字排序会把“1K”和“2M”都当作字符串导致顺序错误。-h选项能智能识别这些单位。-r或--reverse反向排序即从大到小排列。找大文件时必备。-k指定按哪一列排序。当我们的输出结果包含多列信息时如du输出是“大小 文件名”需要用-k来指定。2.4 协作模式理解了各自职责协作方式就清晰了find-exec du -h {} \;用find快速筛选出候选文件尤其是按时间、名称等复杂条件然后针对每个找到的文件执行du查看其具体大小。这种方式灵活但可能因为文件多而慢。du -asort -hr用du -a获取当前目录下所有文件的磁盘使用量然后通过管道|送给sort -hr进行从大到小的排序。这是最直观、最常用的“找大文件”组合拳。find -type f -size 阈值直接使用find的-size筛选出大于某个尺寸的文件。速度快适合目标明确如“找出所有大于1G的文件”的场景。3. 实战组合拳从扫描到排序的完整流程理论说再多不如动手试一遍。下面我们以最常见的场景——查找/var目录下的大文件为例演示几种高效的组合命令。/var是系统日志、缓存、数据库文件常驻的地方也是空间告警的“重灾区”。3.1 方法一经典直拳——du与sort的黄金组合这是我最推荐新手首先掌握的方法直接了当一目了然。sudo du -ah /var | sort -rh | head -20让我们拆解这个命令链sudo du -ah /var以管理员权限因为/var下很多文件属主是 root递归计算/var目录下所有文件和目录的磁盘使用量-a并以人类可读格式-h输出。输出格式是两列大小 路径。| sort -rh将上一步的输出通过管道传递给sort命令。-r表示反向排序从大到小-h是关键它告诉sort“第一列是人类可读的大小字符串请按实际数值大小来排序”而不是简单的字符串字典序。| head -20只显示排序后最前面的20行结果。你可以根据需要调整这个数字比如head -50。执行后你会看到类似这样的输出4.5G /var/lib/docker/overlay2/.../merged 2.1G /var/log/syslog.1 1.8G /var/cache/apt/archives/ 1.5G /var/lib/snapd 800M /var/log/kern.log ...优点命令简单结果清晰既能看出大文件也能看出大目录。缺点如果目录树非常庞大如数百万文件du -a的初始扫描可能会比较耗时。它统计了每一个文件。3.2 方法二精准点射——使用find按尺寸筛选如果你明确知道要找“大于某个尺寸”的文件比如所有超过500MB的日志文件那么find的-size筛选会更高效。sudo find /var -type f -size 500M -exec du -h {} \;命令拆解sudo find /var在/var目录开始查找。-type f只查找普通文件。-size 500M筛选出大小超过500MB的文件。-exec du -h {} \;对每一个找到的文件执行du -h命令来显示其人类可读的大小。{}是find找到的文件路径的占位符\;是-exec参数的结束符。这个命令的好处是find在遍历时一旦发现文件不满足-size 500M的条件就可以立即跳过无需像du那样先计算所有文件的大小。在文件极多的目录中这可能更快。但是这个输出是没有排序的。为了获得排序后的列表我们可以利用命令替换sudo find /var -type f -size 500M -exec du -h {} | sort -rh这里将\;换成了。-exec ... 的形式会将找到的多个文件一次性传递给后面的命令du这样du只需要运行一次效率更高然后再将du的输出进行排序。3.3 方法三终极可视化——整合ls与awk对于追求极致信息密度和可读性的朋友可以尝试这个更复杂的组合。它能生成一个类似ls -lh但包含完整路径且已排序的列表。sudo find /var -type f -exec du -h {} | sort -rh | head -20 | awk {printf %s\t%s\n, $1, $2}或者如果你还想看到文件修改时间sudo find /var -type f -exec du -h {} | sort -rh | head -20 | while read size path; do ls -lh $path | awk -v sz$size {print sz, $6, $7, $8, $9}; done这个命令看起来复杂其实原理是先找到大文件并排序然后对前20个结果循环地用ls -lh获取其详细信息时间、权限等再用awk整理输出格式。这更适合需要综合判断文件新旧来做删除决策的场景。重要提示在/var、/usr、/etc等系统目录下操作时务必使用sudo。因为很多系统文件属于 root 用户普通用户没有读取权限du或find会报 “Permission denied” 并可能返回不完整的结果。使用sudo能确保扫描的完整性。4. 场景化应用与排查策略掌握了基本命令组合我们来看看在不同实际运维场景下如何灵活运用它们。4.1 场景一根目录突然爆满的紧急排查现象df -h显示/分区使用率 95%系统运行缓慢。策略采用“自上而下逐层聚焦”法。快速定位热点目录sudo du -h --max-depth1 / | sort -rh这条命令快速查看根目录下所有一级子目录的大小通常能立刻发现是/var、/home还是/opt异常膨胀。深入问题目录假设发现是/var最大则进入下一步sudo du -ah /var | sort -rh | head -30常见嫌疑犯检查日志文件重点检查/var/log。特别是journalctl日志如果使用 systemd和syslog、kern.log、auth.log等。sudo find /var/log -type f -name *.log -size 100MDocker/容器检查/var/lib/docker尤其是overlay2目录容器镜像和未清理的缓存可能占用巨大空间。APT/YUM缓存检查/var/cache/apt/archives/或/var/cache/yum这些是软件包安装后留下的缓存。临时文件检查/tmp和/var/tmp。4.2 场景二为特定用户查找家目录中的大文件现象某个用户报告其家目录空间不足。策略直接针对用户目录进行精细扫描。sudo du -ah /home/username | sort -rh | head -50或者如果用户家目录下有很多小文件用find直接找大文件更快sudo find /home/username -type f -size 100M -exec du -h {} | sort -rh常见目标.iso、.zip、.tar.gz等归档文件虚拟机磁盘镜像.vdi、.qcow2下载的视频文件开发环境中的node_modules目录等。4.3 场景三按时间维度查找“近期”产生的大文件有时候空间是最近几天才被快速占满的找到“新产生”的大文件是关键。sudo find / -type f -size 500M -mtime -7 -exec ls -lh {} \;这里引入了-mtime -7选项表示查找修改时间在7天以内的文件。-mtime 7则表示7天以前。结合-size可以精准定位“近期出现的巨无霸”。5. 安全清理指南与避坑要点找到大文件只是第一步安全地清理它们才是最终目的。鲁莽的rm -rf可能导致系统崩溃或数据丢失。5.1 清理前的黄金法则确认再确认在按下回车键执行rm之前务必再次用ls -lh或file命令查看一下目标文件的详细信息确认其路径和内容。一个经典的错误是sudo rm -rf / var/log/nginx/access.log/和var之间多了一个空格这将删除根目录下的所有内容先移动后删除对于不确定能否删除的文件尤其是日志文件可以先将其移动到其他分区或临时目录观察一段时间系统是否运行正常再决定是否删除。sudo mv /var/log/huge.log /tmp/huge.log.bak使用日志轮替和归档对于日志文件最佳实践是配置logrotateLinux自带工具让其自动按时间或大小切割、压缩、归档并删除旧日志。不要手动删除正在被进程写入的日志文件这可能导致程序报错或日志丢失。可以清空文件内容而非删除文件sudo : /var/log/big.log # 或 sudo truncate -s 0 /var/log/big.log5.2 针对不同文件类型的清理策略系统日志文件使用journalctl清理 systemd 日志sudo journalctl --vacuum-size200M将日志总大小限制在200M。检查/etc/logrotate.conf和/etc/logrotate.d/下的配置确保日志轮替正常工作。APT/YUM缓存sudo apt clean(Debian/Ubuntu) 或sudo yum clean all(RHEL/CentOS) 可以安全清理所有软件包缓存。sudo apt autoclean仅删除过时的无法再下载的软件包缓存。Docker资源docker system prune -a会清理所有停止的容器、未被任何容器使用的网络、构建缓存和悬空的镜像。执行前请确保理解其含义。更精细的控制docker image prune清理镜像docker container prune清理容器。Snap包缓存sudo rm -rf /var/lib/snapd/cache/*可以清理 snap 的缓存但重启 snap 服务后可能会重新生成部分。用户缓存如~/.cache目录可以手动检查并清理其中特定应用如浏览器、IDE的缓存。5.3 自动化监控与清理脚本思路对于生产环境可以写一个简单的脚本定期运行将大文件列表通过邮件发送给管理员。#!/bin/bash # find_large_files.sh THRESHOLD500M SEARCH_PATH/var OUTPUT_FILE/tmp/large_files_$(date %Y%m%d).txt EMAILadminexample.com echo 查找 ${SEARCH_PATH} 下大于 ${THRESHOLD} 的文件... $OUTPUT_FILE echo $OUTPUT_FILE sudo find $SEARCH_PATH -type f -size $THRESHOLD -exec du -h {} 2/dev/null | sort -rh $OUTPUT_FILE # 如果找到文件则发送邮件需要配置好邮件发送服务 if [ -s $OUTPUT_FILE ]; then mail -s Large Files Report on $(hostname) $EMAIL $OUTPUT_FILE fi可以将此脚本加入crontab每周运行一次。6. 进阶技巧与疑难问题排查6.1 处理“Permission denied”噪音在扫描整个根目录时会遇到大量权限错误干扰输出。我们可以将错误信息重定向到/dev/null。sudo find / -type f -size 100M 2/dev/null | head -20或者对于dusudo du -ah / 2/dev/null | sort -rh | head -30注意这也会隐藏真正的错误所以最好在初步扫描时使用精细排查时还是应该关注具体目录。6.2 查找已删除但未释放空间的文件lsof有时候du和df显示的结果差异巨大df显示空间已满但du统计所有文件加起来却没那么多。这通常是因为有文件被进程打开并写入后又被删除了。在Linux中如果一个文件正在被进程使用即使你rm了它只要进程不退出该文件占用的磁盘空间就不会释放。使用lsof命令查找这类文件sudo lsof L1或者更精确地sudo lsof | grep deleted这会列出所有已被删除但仍有进程在使用的文件及其进程ID。解决方法是重启或安全地终止对应的进程。6.3 为什么du和ls显示的大小不一样这是一个常见疑问。ls -l显示的是文件的“逻辑大小”logical size即文件内容实际有多少字节。而du默认显示的是文件在磁盘上占用的“块大小”block size的整数倍。例如文件系统块大小是4KB一个1字节的文件ls -l显示1B但du会显示4KB。对于大文件这个差异通常可以忽略但对于海量小文件累积的差异会非常显著。du --apparent-size选项可以显示逻辑大小更接近ls的结果。6.4 使用ncdu进行交互式可视化分析如果你更喜欢图形化界面ncduNCurses Disk Usage是一个绝佳的命令行工具。它提供交互式界面可以像文件管理器一样浏览目录并按大小排序。# 安装 sudo apt install ncdu # Debian/Ubuntu sudo yum install ncdu # RHEL/CentOS # 使用 sudo ncdu /进入界面后用方向键导航按d删除文件非常小心它比纯命令行更直观尤其适合探索性分析。磁盘空间管理是Linux系统运维的日常而find、du、sort这套组合拳就是你的瑞士军刀。从简单的du -sh *查看当前目录到复杂的按时间、大小、类型多条件筛选再到自动化监控报告其核心思想始终是先定位再分析最后安全操作。记住清理系统文件永远要怀有敬畏之心不确定时移动比删除更安全。把这些命令和策略加入到你的运维工具箱里下次再面对磁盘空间告警时你就能从容不迫精准打击了。
返回列表