Linux du 命令:估算文件空间

LinuxBeginner
立即练习

介绍

在本实验中,我们将探索 Linux 中的 du(disk usage,磁盘占用)命令,这是一个用于估算和分析磁盘空间占用的强大工具。假设你是一名系统管理员,负责管理一台文件增长迅速的服务器。你的任务是识别出占用空间的目录和文件,从而帮助优化存储利用率。在这次磁盘空间调查中,du 命令将是你最可靠的侦探工具。

理解 du 的基础知识

du 命令是你了解磁盘空间占用的第一道防线。让我们先从检查它的基本功能开始。

首先,导航到我们将进行调查的项目目录:

cd ~/project

现在,运行一个基础的 du 命令:

du

提示:文件和文件夹是随机创建的,它们的大小也是随机的,因此你每次运行的结果可能会有所不同。

你会看到类似这样的输出:

0       ./documents/reports
0       ./documents
10240   ./backups
0       ./logs/archive
0       ./logs/system
5120    ./logs/application
5120    ./logs
15360   .

每行显示了两部分信息:

  1. 磁盘占用量(单位为 KB)
  2. 对应的目录路径

这些数字起初看起来可能有些晦涩。它们代表以千字节(KB)为单位的磁盘占用量。但别担心,我们可以让它们变得更易读!

让我们运行带有 -h(human-readable,易读格式)选项的命令:

du -h

现在你会看到如下输出:

0       ./documents/reports
0       ./documents
10M     ./backups
0       ./logs/archive
0       ./logs/system
5.0M    ./logs/application
5.0M    ./logs
15M     .

-h 选项将大小转换为更符合人类阅读习惯的格式(K 代表千字节,M 代表兆字节等)。这让我们一眼就能轻松理解。

有几点需要注意:

  • 末尾的 . 代表当前目录(在本例中为 ~/project)。
  • 一个目录的磁盘占用量包含了其所有子目录的占用量。
  • 你看到的大小可能会略有不同,因为设置脚本生成的是随机大小的文件。

调查特定目录

既然我们已经了解了基础知识,现在让我们深入研究特定的目录。我们将重点关注 logs 目录,它似乎占用了相当大的空间。

首先,切换到日志目录:

cd ~/project/logs

现在,使用 du 来检查这个目录:

du -h

你可能会看到如下输出:

0       ./archive
0       ./system
5.0M    ./application
5.0M    .

这为我们展示了日志目录下每个子目录的磁盘占用明细。但如果我们只想看日志目录的总计呢?

我们可以使用 --max-depth 选项来限制 du 查找目录结构的深度:

du -h --max-depth=0

这将仅输出当前目录的总计:

5.0M    .

--max-depth=0 告诉 du 只显示当前目录,而不进入任何子目录。

要查看直接子目录的情况,请使用 --max-depth=1

du -h --max-depth=1

输出:

0       ./archive
0       ./system
5.0M    ./application
5.0M    .

这让我们更清晰地了解到哪些子目录占用的空间最多。

当你处理嵌套极深的目录结构,并且只想关注特定层级时,--max-depth 选项特别有用。

排序并分析磁盘占用

现在我们已经识别出了占用空间最多的子目录,让我们学习如何对结果进行排序。这将帮助我们快速找出磁盘空间的最大消耗者。

我们将结合使用 sort 命令和 du。如果你不熟悉 sort 也不要紧——我们会解释它的工作原理。

首先,让我们按大小对 du 的输出进行排序:

du -h | sort -h

这个命令执行了两个操作:

  1. du -h:以易读格式运行磁盘占用命令。
  2. |:这是一个管道符。它将左侧命令的输出作为输入传递给右侧命令。
  3. sort -h:根据易读的大小数值对输入进行排序。

你可能会看到如下输出:

0       ./archive
0       ./system
5.0M    .
5.0M    ./application

输出结果按从小到大排序。但通常情况下,我们对最大的目录更感兴趣。要反转排序顺序,我们可以给 sort 添加 -r 选项:

du -h | sort -hr

输出:

5.0M    ./application
5.0M    .
0       ./system
0       ./archive

现在我们可以清楚地看到日志文件夹中哪些子目录占用的空间最多,且按降序排列。

如果只想关注直接子目录并对其排序,我们可以结合之前学到的技术:

du -h --max-depth=1 | sort -hr

该命令将仅显示并排序当前目录的直接子目录。

请记住,命令行界面的强大之处在于通过组合简单的命令来执行复杂的操作。我们刚刚结合了 dusort 以及各种选项来快速分析磁盘占用!

查找最大的文件

到目前为止,我们一直在查看目录大小。但如果我们想找到占用空间最多的具体文件呢?du 命令主要针对目录工作,但我们可以将其与其他命令结合来查找大文件。

我们将使用 find 命令配合 du。如果你不熟悉 find 也不要紧——我们会解释它的工作原理。

首先,让我们回到项目目录:

cd ~/project

现在,让我们使用 finddu 来定位最大的文件:

find . -type f -exec du -h {} + | sort -hr | head -n 5

这个命令看起来可能很复杂,让我们拆解一下:

  1. find . -type f:在当前目录(.)及其子目录中查找所有文件(-type f)。
  2. -exec du -h {} +:对找到的每个文件执行 du -h{} 会被替换为文件名,+ 告诉 find 尽可能多地将文件名传递给每次 du 调用。
  3. sort -hr:按大小反向排序(最大的排在前面)。
  4. head -n 5:仅显示前 5 条结果。

你可能会看到如下输出:

10M     ./backups/large_backup.bak
5.0M    ./logs/application/large_app_log.log
0       ./logs/system/placeholder.log
0       ./logs/archive/placeholder.log
0       ./logs/application/placeholder.log

此输出向我们展示了项目目录中最大的五个文件及其大小。

要专注于大于特定大小的文件,我们可以修改命令。让我们查找大于 1MB 的文件:

find . -type f -size +1M -exec du -h {} + | sort -hr

这个命令增加了 -size +1M 来过滤出大于 1 兆字节的文件。

当你试图释放磁盘空间时,这些命令非常有用。它们能让你快速识别出最大的文件,这些文件通常是删除或存档的最佳候选对象。

生成磁盘占用报告

作为磁盘空间调查的最后一步,让我们为整个项目目录创建一个全面的磁盘占用报告。这份报告将帮助我们总结发现并向团队展示。

首先,确保我们在项目目录中:

cd ~/project

现在,让我们使用 du 创建一份详细报告并将其保存到文件中:

du -h --max-depth=2 | sort -hr > disk_usage_report.txt

让我们拆解这个命令:

  1. du -h --max-depth=2:以易读格式显示深达两层的磁盘占用情况。
  2. sort -hr:按大小反向排序(最大的排在前面)。
  3. > disk_usage_report.txt:将输出保存到名为 disk_usage_report.txt 的文件中。> 被称为重定向操作符——它将原本显示在屏幕上的输出“重定向”到文件中。

既然已经创建了报告,让我们查看它的内容:

cat disk_usage_report.txt

你应该能看到一份完整的目录列表及其大小,按从大到小排列。

要获取最大目录的摘要,我们可以使用 head 命令仅查看前几条记录:

head -n 10 disk_usage_report.txt

这将显示你项目中最大的 10 个目录。

这份报告是识别项目中哪些区域消耗磁盘空间最多的宝贵工具。它可以指导你优化存储使用,或在与团队讨论资源分配时提供参考。

总结

在本实验中,我们探索了强大的 du 命令及其在管理磁盘空间中的应用。我们学习了如何:

  1. 使用基础 du 命令估算磁盘占用。
  2. 使用 -h 选项使输出易于阅读。
  3. 调查特定目录并使用 --max-depth 限制深度。
  4. 排序并分析磁盘占用结果。
  5. 查找目录中最大的文件。
  6. 生成全面的磁盘占用报告。

这些技能对于任何管理存储资源的系统管理员或高级用户来说都是必不可少的。

本实验未涵盖的其他 du 选项包括:

  • -s:仅显示每个参数的总计。
  • -c:产生一个总计(grand total)。
  • -a:显示文件和目录的磁盘占用情况。
  • --time:显示每个目录最后修改的时间。
  • --exclude=PATTERN:排除匹配特定模式(PATTERN)的文件或目录。