技术咨询:如何查找扩展名字母排序最高的文件?
嘿,针对你要找出每个前缀下扩展名字母序最高文件的需求,结合你的文件创建规则,我整理了两个实用的shell方案,亲测可以得到你想要的结果:
方法一:直接按扩展名字母序筛选
这个方法精准匹配你“找字母序最高扩展名”的需求,通过排序+分组提取的方式实现:
find . -name 'L_*.[J-Z]' | sort -t '.' -k1,1 -k2,2r | awk -F '.' 'prev != $1 {print; prev=$1}'
命令拆解:
find . -name 'L_*.[J-Z]':先把所有符合命名规则的文件找出来,就是你示例里的那些文件sort -t '.' -k1,1 -k2,2r:以.为分隔符,先按第一部分(比如L_58420)升序排序,再按第二部分(扩展名)降序排序——这样每个前缀组里,扩展名最大的文件会排在最前面awk -F '.' 'prev != $1 {print; prev=$1}':遍历排序后的结果,只输出每个前缀的第一行(也就是扩展名最大的那个文件)
用你给出的示例文件测试,执行后会输出:
L_46657.O
L_58420.Q
完全符合你的期望~
方法二:利用文件修改时间筛选(适配你的创建规则)
你提到“仅当低字母序文件存在时,才会创建高字母序文件”,这意味着高字母序的文件修改时间肯定更晚。那我们可以直接按修改时间倒序,取每个前缀的最新文件:
find . -name 'L_*.[J-Z]' -printf "%T@ %p\n" | sort -k2,2 -k1,1r | awk '{split($2, arr, "."); if (prev != arr[1]) {print $2; prev=arr[1]}}'
命令拆解:
find . -name 'L_*.[J-Z]' -printf "%T@ %p\n":输出每个文件的秒级带小数的修改时间戳和完整路径,方便后续排序sort -k2,2 -k1,1r:先按文件路径的前缀分组排序,再按时间戳降序排列,这样同前缀里最新创建的文件会排在最前面awk部分:把文件路径按.分割提取前缀,只输出每个前缀的第一个(最新的)文件
这个方法更依赖你的创建规则,但好处是如果文件名规则有变动(比如扩展名不是连续字母),只要创建顺序不变,依然能得到正确结果。
内容的提问来源于stack exchange,提问作者mauek unak
相关产品推荐
相关产品推荐

