在 Linux 中查找最大和最小的文件和目录

Linux系统中的每个文件和目录都有一个相关的大小,通常用字节、千字节(KB)、兆字节(MB)、千兆字节(GB)等来衡量。虽然单个文件的大小相对简单,但目录的大小包括目录本身及其所有递归内容所消耗的总空间。

关键工具:du 和 find

  • du(磁盘使用情况):此命令估计文件和目录空间使用情况。它遍历目录并聚合单个文件占用的空间,显示目录的累积大小。
  • find:用于在指定目录下查找文件和目录,使用不同的选项来过滤和限制查找的结果,可以与其他命令协同,以根据各种条件(包括大小)精确定位文件和目录。

查找最大的目录和文件

假设磁盘空间不足,需要清理一些空间。识别大型目录是合乎逻辑的第一步。要查明特定位置中最大的目录和文件,然后再针对性的进行文件的清理。

查找最大的目录

du -sh /home/user/* | sort -rh | head -n 10

执行后,将看到目录中前 10 个最大的目录

命令解读:

  • du -sh:du命令估计空间,标志-sh确保输出是人类可读的格式(-h),并且我们正在总结总大小(-s)
  • sort -rh:对结果进行排序。-r标志确保反向排序(最大优先),-h确保像’ 2K ‘和’ 1M '这样的大小以逻辑方式排序。
  • head -n 10:输出过滤,只显示前10个结果

查找最大的文件

 find /home/user -type f -exec du -h {} + | sort -rh | head -n 10

该命令将列出 /home/user 目录下最大的10个文件。type - f 确保只查找文件,不包括目录。

查找最小的目录和文件

查找最小的目录

du -sh /home/user/* | sort -h | head -n 10

此命令类似于最大目录的对应命令,列出 /home/user 下最小的10个目录 ,但根据大小按升序排列。

查找最小的文件

find /home/user -type f -exec du -h {} + | sort -h | head -n 10

此命令列出 /home/user 下最小的10个文件

拓展----在Windows 10中使用命令提示符查找大文件

和Linux一样,Windows中也有一些有用的命令。可以使用它们来快速查找大文件。
第一个命令是众所周知的“if”命令。
它是一个控制台命令,允许在批处理文件中构建条件分支。

if /?

if有很多选项。这里主要用到关于比较操作的部分。它们如下:

  EQU - 等于
  NEQ - 不等于
  LSS - 小于
  LEQ - 小于或等于
  GTR - 大于
  GEQ - 大于或等于

可以用它们来分析文件的大小。
语法:IF file_size_value GTR some_other_value_tocompare some_action_here.

我们需要传递file_size_value来查找大文件。另一个专为这类任务设计的内置命令将帮助我们。它是用于文件的。该命令选择一个文件(或一组文件),并对该文件执行命令

forfiles /?

在我们的例子中,主要是用这2个选项:

/S  -文件递归到子目录。比如“DIR /S”。
/C  -该命令指定要在每个文件上执行的命令。命令字符串应该用双引号括起来。
     默认命令是 "cmd /c echo @file"。下列变量
     可以用在命令字符串中:
     @file    - 返回文件名。
     @fname   - 返回不带扩展名的文件名。
     @ext     - 只返回文件的扩展名。
     @path    - 返回文件的完整路径。
     @relpath - 返回文件的相对路径。
     @isdir   - 如果文件类型是目录,返回 "TRUE";
                如果是文件,返回 "FALSE"。
     @fsize   - 以字节为单位返回文件大小。
     @fdate   - 返回文件上一次修改的日期。
     @ftime   - 返回文件上一次修改的时间。
     要在命令行包括特殊字符,字符请以 0xHH
     形式使用十六进制代码(例如,0x09 为 tab)。
     内部 CMD.exe 命令前面应以 "cmd /c" 开始。

最终组合命令如下

forfiles /S /C "cmd /c if @fsize GTR 1048576 echo @path"

递归查找比较文件大小,大于1048576字节的文件会输出文件的全路径
在这里插入图片描述
当然如果要从指定目录开始搜索,那就加上 /P 选项

/P <pathname>	指定从中开始搜索的路径。 默认情况下,在当前工作目录中开始搜索。 

从C盘开始搜索
forfiles /P c:\ /S /C "cmd /c if @fsize GTR 1048576 echo @path"

从D盘开始搜索
forfiles /P d:\ /S /C "cmd /c if @fsize GTR 1048576 echo @path"