欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

linux du 命令参数 详解 du -sh * | sort -rh | head 命令详解 AG chatgpt 有大用 有大大用

指定目录:  du -sh /path/to/directory/* | sort -rh | head



linux     # du -sh * | sort -rh | head   命令详解

Linux命令详解:du -sh * | sort -rh | head

这个命令组合用于查找当前目录中占用空间最大的文件或目录。下面是对每个部分的详细解释:

命令分解

  1. du -sh *

  • du (disk usage):显示磁盘使用情况

  • -s:显示每个指定项目的总计大小(不显示子目录详情)

  • -h:以人类可读的格式显示(KB、MB、GB等)

  • *:匹配当前目录下的所有文件和目录

  • | sort -rh

    • |:管道,将前一个命令的输出传递给下一个命令

    • sort:排序命令

    • -r:反向排序(从大到小)

    • -h:以人类可读的数字大小排序(能正确识别KB、MB、GB等单位)

  • | head

    • head:显示输出结果的前10行  ( 默认是 前10 行,,,,想显示前20行的话,使用 head -n 20 或者 head -20)

    完整功能

    这个命令组合会:

    1. 计算当前目录下每个文件/目录的磁盘使用量

    2. 以人类可读格式显示

    3. 按照大小从大到小排序

    4. 只显示最大的10个项目

    使用场景

    • 快速找出占用大量空间的文件/目录

    • 清理磁盘空间前的分析

    • 检查是否有异常的大文件

    变种和注意事项

    1. 只查看目录du -sh */ | sort -rh | head

    2. 查看隐藏文件du -sh .[!.]* * | sort -rh | head

    3. 指定目录du -sh /path/to/directory/* | sort -rh | head

    4. 注意:在文件/目录数量很多的情况下可能会比较慢

    这个命令是Linux系统管理员和开发人员常用的磁盘空间分析工具之一。




    sort -rh 这里 反向 是什么意思,是数字大小反向 还是 字母顺充反向

    在 sort -rh 命令中,-r(reverse)表示反向排序,这里的反向是针对数字大小的反向(从大到小排列),而不是字母顺序的反向。

    详细解释:

    1. -r 的作用

    • 默认情况下,sort 会按升序(从小到大)排列。

    • 如果加入 -r,就会变成降序(从大到小)。

    • 在 du 命令的输出中,数据通常是类似 1.5G500M100K 这样的"人类可读"大小,所以 -r 让它们按文件/目录大小从大往小排。

  • -h 的作用(human-readable sort):

    • 错误的排序(默认字典序):10K > 2G(因为 1 < 2

    • 正确的排序-h):2G > 10K

    • -h 让 sort 能智能识别 KMG 等单位,并按数值大小排序。

    • 如果没有 -hsort 会按照字符串字典序排序,导致 10K 排在 2G 前面(因为 1 的 ASCII 码小于 2),这显然不正确。

    • 例如:

    总结:

    • sort -rh = 按人类可读的大小数值降序排列(最大的在最前面)。

    • 如果不是处理du的输出(比如要按字母反向排序),可以单独用 sort -r(例如 ls | sort -r 就是按文件名字母倒序)。

    实际例子:

    假设当前目录下有:

    10K  file1.txt
    2G   backup.tar
    500M data.log
    

    运行 du -sh * | sort -rh 会正确排序:

    2G   backup.tar
    500M data.log
    10K  file1.txt
    

    而如果只用 sort -r(不带 -h),可能会出现错误的字母排序,如 10K 排在了 2G 前面。


    du -sh * | sort -rh  这里 sort 是对第一列排序吗

    是的!在 du -sh * | sort -rh 这个命令中,sort 默认会对每一行的第一个字段(即文件/目录的大小)进行排序,但关键点在于 -h 参数会让排序逻辑正确识别人类可读的容量单位(K、M、G等)。


    详细解释:

    1. du -sh * 的输出格式

    • 每行通常由两部分组成,例如:

      4.0K  file1.txt
      2.5G  backup.tar
      180M  data.log
      
    • 第一列是大小(默认是 sort 的排序依据),第二列是文件/目录名。

  • sort 的默认行为

    • sort 默认以**行的第一个字段(空格/TAB分隔)**作为排序键。

    • 如果不加 -h,它会按字典序(字母顺序)排序,导致 10K 排在 2G 前面(因为 1 < 2 字符),这显然不符合我们的预期。

  • -h 的作用

    • -h(human-readable)让 sort 能智能识别数字+单位(如 KMG),并按实际数值排序:

      bash
      2.5G  backup.tar    # 正确的最大值 180M  data.log 4.0K  file1.txt
    • 此时 sort 依然以第一列为排序依据,但会解析它的数值而非字符串。


    验证方法:

    如果想确认 sort 究竟对哪一列排序,可以用 -k 参数指定列:

    bash
    du -sh * | sort -rh -k1   # 明确按第1列排序(大小) du -sh * | sort -rh -k2   # 按第2列排序(文件名,此时结果会混乱)

    默认情况下 -k1 是省略的,所以 sort -rh 就是按第一列(大小)排序。


    总结:

    • du -sh * | sort -rh 按第一列(人类可读的大小)降序排序

    • -h 是关键,它让排序正确解析 K/M/G 等单位,避免字典序的误排。


    du -sh * | sort -rh -k1   这里 -k1 ,,,k是什么缩写

    这里的 -k 是 sort 命令参数的 key(键) 的缩写,用于指定排序的列或字段

    详细解释:

    1. -k 的含义

    • -k 代表 key(排序键),用于告诉 sort 应该按照哪一列(字段)进行排序。

    • 语法:-k<起始列>[.<起始字符>,<终止列>[.<终止字符>]]

      • -k1 = 按第 1 列 排序(默认从该列第一个字符到行尾)

      • -k2,3 = 从第 2 列到第 3 列

      • -k3.5 = 从第 3 列的第 5 个字符开始

    2. 为什么 -k1 通常可以省略?

    sort 默认就是以第 1 列(-k1)排序,所以:

    bash
    du -sh * | sort -rh      # 等价于按第 1 列(大小)排序 du -sh * | sort -rh -k1  # 显式指定按第 1 列排序

    效果是一样的。

    3. 何时需要 -k

    当需要按非第一列排序时,必须用 -k 指定列。例如:

    bash
    # 按文件名(第 2 列)排序,而不是大小 du -sh * | sort -k2      # 按文件名字母顺序 du -sh * | sort -k2 -r   # 按文件名字母逆序

    4. 更复杂的 -k 用法

    如果数据有多个字段,可以用 -t 指定分隔符,再用 -k 选择列:

    bash
    # 示例:对 /etc/passwd 按 UID(第 3 列)排序 awk -F: '{print $1,$3}' /etc/passwd | sort -k2 -n

    (这里 -F: 表示用 : 分割字段)


    总结:

    参数含义示例
    -k1按第 1 列排序`du -sh *
    -k2按第 2 列排序`du -sh *
    -k2.3按第 2 列第 3 个字符排序`...
    -n按数字大小(而非字符串)排序`...

    在 du -sh * | sort -rh -k1 中,-k1 的作用是显式声明对第 1 列排序,但实际可以省略,因为 sort 默认就是按第 1 列排序。


    sort  按数字排序 是  -n 吗? -n 是什么简写

    在 sort 命令中,-n 用于 按数字(numeric)大小排序(而不是默认的字典序)。它的作用是强制让 sort 把字段解析为数值进行排序,而不是字符串。


    -n 详解

    1. -n 是什么?

    • 缩写代表 --numeric-sort(数值排序)。

    • 例如:

      bash
      echo -e "10\n2\n1" | sort       # 默认字典序 → 1, 10, 2(错误的数字排序) echo -e "10\n2\n1" | sort -n    # 数字排序 → 1, 2, 10
  • -n vs. -h

    • -n → 仅适用于纯数字(如 2024123),不能解析 KMG 等单位。

    • -h → 适用于人类可读的数值(如 2K1G),常用于 du 或 ls -lh 的输出。

  • 常见用途

    bash
    # 1. 对纯数字排序 echo -e "100\n20\n3" | sort -n    # 输出:3, 20, 100 # 2. 对文件按行号排序 grep "error" log.txt | sort -n    # 假设行号是数字 # 3. 结合 `-k` 对指定列按数字排序 awk '{print $3}' data.txt | sort -n

  • 对比 -n-h、默认排序

    场景示例数据默认 sortsort -nsort -h
    纯数字3\n10\n210, 2, 32, 3, 102, 3, 10
    带单位(KM1K\n10M\n2G10M, 1K, 2G1K, 10M, 2G1K, 10M, 2G
    混合数字和字母a10\nb2\nc1a10, b2, c1a10, b2, c1a10, b2, c1

    注意-h 仅支持 K/M/G/T 等单位,对纯字母无效。


    总结

    • -n(numeric sort):仅对纯数字有效,强制按数值大小排序。

    • -h(human-readable sort):对 du -h 或 ls -lh 的输出(如 1K2G)有效。

    • 默认排序:按字典序(ASCII 码),可能导致 10 < 2

    使用建议

    bash
    # 处理数字时优先用 -n sort -n file.txt # 处理 `du` 或 `ls` 的输出时用 -h du -sh * | sort -rh




    du -hsx *     ,,  du -sh *   ,,   du -h --max-depth=1 三个命令 详解 区别


    这三个 du 命令都用于查看磁盘使用情况,但在统计范围、输出格式和递归深度上有重要区别。以下是详细对比:


    1. du -hsx *

    命令解释

    • -h:以人类可读格式显示(KB/MB/GB)

    • -s:仅显示汇总大小(不递归子目录细节)

    • -x:仅统计当前文件系统(跳过挂载点如 /mnt、NFS 等)

    • *:当前目录下的所有项目(不含隐藏文件)

    输出特点

    • 每个文件/目录只显示一行总大小

    • 跳过其他文件系统的内容(如挂载的磁盘)

    • 不显示当前目录的汇总行

    示例输出

    bash
    12K    file.txt 50M    Downloads 0      external_disk  # 挂载点被忽略(由于 -x)

    适用场景
    快速查看当前目录下各项目的大小,且明确排除外部挂载的存储。


    2. du -sh *

    命令解释

    • -sh:等同于 -h -s(人类可读+汇总模式)

    • 无 -x 选项,故会统计所有挂载点

    • *:当前目录所有项目(不含隐藏文件)

    输出特点

    • 每个文件/目录一行汇总大小

    • 包含其他文件系统的内容(如挂载的磁盘/NFS)

    • 不显示当前目录的汇总行

    示例输出

    bash
    12K    file.txt 50M    Downloads 20G    external_disk  # 挂载点被统计

    适用场景
    需要统计当前目录下所有内容(包括挂载点)的汇总大小。


    3. du -h --max-depth=1

    命令解释

    • -h:人类可读格式

    • --max-depth=1:仅显示当前目录和直接子项的占用(递归深度=1)

    • 无 -x,会统计挂载点

    • 无需 *,直接分析当前目录

    输出特点

    • 显示当前目录的汇总行(.或目录名

    • 列出所有子项(文件和目录)的单独大小

    • 比 -s 更详细,比默认递归更简洁

    示例输出

    bash
    12K    ./file.txt 50M    ./Downloads 20G    ./external_disk 20G    .           # 当前目录总大小

    适用场景
    需同时查看当前目录总大小和直接子项的占用情况。


    核心区别总结

    特性du -hsx *du -sh *du -h --max-depth=1
    显示格式仅汇总大小仅汇总大小子项细节 + 当前目录汇总
    递归深度无递归(仅汇总)无递归(仅汇总)深度=1(直接子项)
    是否跨文件系统❌ 跳过挂载点(-x✔️ 统计挂载点✔️ 统计挂载点
    隐藏文件不统计不统计可通过 .* 扩展统计

    选择建议

    1. 快速检查目录大小(排除挂载点) → du -hsx *

    2. 统计所有内容(含挂载点) → du -sh *

    3. 分析当前目录结构 → du -h --max-depth=1

    附加技巧

    • 若要包含隐藏文件,改用 du -hsx .[!.]* * 或 du -h --max-depth=1 .

    • 在大型目录中,--max-depth 比无限制递归更高效。

    使用场景建议

    1. 快速查看目录大小:用 du -hs * 或 du -sh *(简洁)。

    2. 分析目录结构:用 du -h --max-depth=1(更详细,含汇总)。

    3. 统计当前目录总大小du -sh .(仅汇总当前目录)。

    注意:如果目录中有大量文件,* 可能会触发“参数列表过长”错误,此时建议改用:

    bash
    find . -maxdepth 1 -exec du -hs {} \;





    -s 是什么简写


    在 du 命令中,-s 是 --summarize 的简写,表示 仅显示总占用空间,不列出子目录或文件的详细内容。

    关键作用

    1. 避免递归输出:默认 du 会递归显示所有子目录的磁盘使用情况,而 -s 只输出当前目录或文件的总大小。

    2. 简洁高效:适合快速查看目录汇总大小,无需关心内部细节。

    示例对比

    无 -s 的情况(默认递归输出)

    bash
    du -h dir

    输出可能为:

    4K    dir/subdir1/file1
    8K    dir/subdir1
    12K    dir/subdir2
    24K    dir          # 总大小
    

    使用 -s(仅汇总)

    bash
    du -sh dir

    输出仅一行:

    24K    dir
    

    常见组合

    • du -sh *:查看当前目录下所有文件和目录的总大小(不递归)。

    • du -sh /path/to/dir:快速统计某个目录的总磁盘用量。

    注意:

    • -s 和 --max-depth=0 效果类似,但 -s 是更简洁的写法。

    • 在需要同时显示人类可读格式(如 KB/MB)时,常与 -h 结合使用(-sh)。

    如果还有其他疑问,欢迎继续提问!



    du -hsx *   中 -x 是什么简写

    在 du -hsx * 命令中,-x 是 --one-file-system 的简写,表示 仅统计当前文件系统的磁盘使用情况,忽略其他挂载点(如 NFS、外接硬盘等)

    -x 的具体作用

    1. 防止跨文件系统统计

    • 默认情况下,du 会递归遍历所有子目录,包括挂载的其他文件系统(例如 /mnt/media 下的外接硬盘或网络存储)。

    • 使用 -x 后,du 会限制在 当前文件系统(即命令执行目录所在的文件系统),跳过其他挂载点。

  • 避免重复或无效统计

    • 如果目录中挂载了其他磁盘(如 /data 是独立分区),-x 可以避免统计这些外部存储的数据,仅计算当前分区的真实使用量。


    示例对比

    假设当前目录 /home 下挂载了一个外部磁盘到 /home/external

    bash
    # 不使用 -x(会统计所有挂载点) du -hs *

    可能输出:

    10G    /home/user
    20G    /home/external   # 外部磁盘被统计
    
    bash
    # 使用 -x(仅统计当前文件系统) du -hsx *

    输出:

    10G    /home/user
    0      /home/external   # 外部磁盘被忽略
    

    常见使用场景

    1. 统计系统根目录的真实用量(忽略 /proc/sys 等虚拟文件系统和其他挂载点):

      bash
      du -hsx /
    2. 精确计算某个分区的空间占用

      bash
      du -hsx /var   # 仅统计 /var 所在分区的数据

    与 -s 和 -h 的关系

    • -s--summarize):仅显示汇总大小。

    • -h--human-readable):以易读单位(KB/MB/GB)显示。

    • -x--one-file-system):限制在当前文件系统。

    三者的组合 -hsx 是一种高效且精准的磁盘统计方式。


    注意事项

    • 如果需要统计所有文件系统(包括挂载点),则不要使用 -x

    • 在脚本中,-x 可以提高效率,避免扫描无关的挂载目录(如 Docker 卷、NFS 等)。

    如果还有其他疑问,欢迎继续提问!



    普通分类: