在 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"