目录
在 Linux 中用 du -sh
一次性统计隐藏文件大小
在日常运维和存储分析中,使用 du -sh *
快速查看当前目录下各文件和子目录的大小非常常用。但你可能会发现,它并不会统计以 “.`” 开头的隐藏文件或隐藏目录。本文将从原理入手,带你了解三种常用方法,轻松将“点文件”也纳入统计视野。
一、问题背景
默认情况下,Bash(以及大多数 POSIX shell)的通配符 *
并不匹配以“.
”开头的文件或目录。这意味着,若你在包含隐藏配置文件(如 .gitignore
、.env
等)的目录执行:
du -sh *
将看不到这些隐藏项的大小,统计结果容易产生误差。为了解决这一问题,可从以下三种方案入手。
二、方案一:扩展通配符模式
最直接的做法是在命令行手动同时指定普通文件与隐藏文件的匹配模式:
du -sh .[!.]* .??* *
-
.[!.]*
:匹配以.
开头、第二个字符不是.
的隐藏项(可避免 “.” 和 “..
”) -
.??*
:匹配以.
开头且总长度至少为 3 的隐藏项,确保捕获所有两个字符以上的点文件(如.env.local
) -
*
:匹配所有普通文件和目录
这样,一行命令就能列出当前目录下所有普通与隐藏文件/目录的大小。
三、方案二:开启 Bash 的 dotglob
选项
如果你习惯仅使用 *
,还可以借助 Bash 的内建选项 dotglob
,临时让通配符包含点文件:
# 启用 dotglob,让 * 匹配所有隐藏项
shopt -s dotglob
# 统计所有文件和目录大小
du -sh *
# 恢复默认行为(可选)
shopt -u dotglob
-
优点:命令更简洁,无需额外列出多个模式
-
缺点:需要记得在脚本或交互结束后关闭
dotglob
,以免影响后续通配符匹配
你可以将上述命令放入临时脚本或在 Shell 会话中运行,快速完成全量统计。
四、方案三:借助 find
与 xargs
当文件名中包含空格或特殊字符时,用通配符可能不够安全。这时推荐使用 find
与 xargs
的组合:
find . -maxdepth 1 ! -name . -print0 \
| xargs -0 du -sh
-
find . -maxdepth 1
:只查找当前目录,不递归 -
! -name .
:排除当前目录自身 -
-print0
和xargs -0
:通过 NUL 字符分隔,完美处理任意字符的文件名
此方法兼具灵活性与安全性,特别适合批量脚本化统计。
五、小结
-
手动模式:适合一行命令搞定,快速简洁;
-
dotglob
开关:最贴近直观习惯的*
写法,但需留意选项状态; -
find
+xargs
:最健壮、安全,适用于复杂场景和脚本自动化。
根据具体需求选择合适方案,便能在 Linux 下无遗漏地统计隐藏文件大小,让存储分析更准确。希望本文能帮助你轻松解决“看不到点文件”的困扰,提升日常运维效率。