如何在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
相关产品推荐
相关产品推荐

