You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GNU Linux(ext4等文件系统)中按文件大小排序查找前30个最大的重复文件?

如何在GNU Linux(ext4等文件系统)中按文件大小排序查找前30个最大的重复文件?

我太懂你的痛点了——找重复文件的工具一抓一大把,但要按文件大小排序、挑出最大的前30个,确实得用点小技巧。而且你说的msort编译坑我也踩过,折腾源码就算了,还有个utf8proc版本死活用不了,完全没必要跟它较劲!

其实用系统自带的工具就能搞定,结合fdupes和标准的sort、awk就行,给你分享几个实用的方案:

方案一:列出前30个最大的重复文件(含同组多文件)

这个命令会把每个重复文件和对应的大小关联起来,按大小从大到小排序后取前30个:

fdupes -Sr . | awk '
    /bytes each/ {
        current_size = $1
        next
    }
    /^--$/ {
        current_size = ""
        next
    }
    current_size != "" {
        print current_size "\t" $0
    }
' | sort -nr | head -n 30

拆解下每个部分:

  • fdupes -Sr .:递归当前目录(-r)查找重复文件,并且先按文件大小分组(-S)
  • awk脚本:负责把每组的文件大小和对应的文件路径对应起来,输出成「大小\t文件路径」的格式
  • sort -nr:按数值大小倒序排序(-n是数值排序,-r是倒序)
  • head -n 30:取排序后的前30行,也就是最大的30个重复文件

方案二:列出前30个最大的重复文件组(每组是一批重复文件)

如果你想按「重复文件组」来筛选,比如不管一个组里有几个重复文件,只取最大的30个组,用这个命令:

fdupes -Sr . | awk '
    /bytes each/ {
        if (group != "") print group
        group = $1 "\n"
        next
    }
    /^--$/ {
        print group
        group = ""
        next
    }
    group != "" {
        group = group $0 "\n"
    }
    END {
        if (group != "") print group
    }
' | sort -nr | head -n 30

这个脚本会把每个重复文件组整合成一个块,按组的大小倒序排序后取前30组,每组里会包含所有重复的文件路径。

关于你之前的命令优化

你之前写的fdupes -Sr . | grep "bytes each" -A 2 | sed "s/--/\n/g"其实已经有了雏形,只是缺了排序和取前30的步骤,而且只能处理每组两个文件的情况。用上面的awk脚本代替grep和sed,能更灵活地处理任意数量的重复文件组。

另外真的没必要折腾msort,GNU系统自带的sort完全能满足需求,省得浪费时间在编译源码上~

备注:内容来源于stack exchange,提问作者user418615

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 11:44:34