BASH如何按文件名首段数字排序.sql文件,修复sort -V排序异常问题
文件名自定义排序解决方案
你之前使用的sort -V是版本自然排序规则,会将文件名中的整段数字作为整数进行全局大小比较,因此会出现31<32<41<42<310的排序结果,不符合你优先按数字首位分组、同组内按数值排序的需求。
方案1:使用sort自定义排序键(最简方案)
通过sort的分隔符和自定义排序键参数,直接实现需求:
find ./databases/ -iname 'file_*.sql' | sort -t '_' -k2.1,2.1 -k2n,2
参数说明:
-t '_':指定下划线_作为字段分隔符,拆分后文件名的第二个字段就是中间的数字段-k2.1,2.1:第一个排序键取第二个字段的第一个字符,按字典序排序,实现3开头的数字整体排在4开头的数字之前-k2n,2:第二个排序键取整个第二个字段,按数值排序,实现同首字符的数字按大小升序排列
方案2:awk预处理后排序(适配更复杂规则)
如果后续排序规则有更复杂的调整,可以用awk先提取排序特征值,排序后再还原文件名:
find ./databases/ -iname 'file_*.sql' | awk -F'_' '{print substr($2,1,1) " " $2 " " $0}' | sort -k1,1 -k2n | cut -d' ' -f3-
获取排序后的最后一个文件
在任意排序命令后追加tail -n1即可:
# 以方案1为例 find ./databases/ -iname 'file_*.sql' | sort -t '_' -k2.1,2.1 -k2n,2 | tail -n1
内容的提问来源于stack exchange,提问作者Isaac Caparrós González
相关产品推荐
相关产品推荐

