代码之家  ›  专栏  ›  技术社区  ›  mauek unak

查找文件扩展名中字母字符最多的文件

  •  -1
  • mauek unak  · 技术社区  · 8 年前

    如何找到文件扩展名中具有最高字母字符的文件? 我的应用程序创建的文件示例:

    $ find . -name 'L_*.[J-Z]'
    L_58420.K
    L_58420.J
    L_58420.M
    L_46657.J
    L_58420.N
    L_58420.P
    L_46657.N
    L_58420.Q
    L_46657.K
    L_58420.O
    L_46657.O
    L_46657.L
    L_46657.M
    L_58420.L
    

    我想回来了:

    L_58420.Q
    L_46657.O
    

    只有当具有前一个字符的文件已经存在时,才会创建更高的字母字符,所以也可以按日期进行搜索/排序。

    3 回复  |  直到 8 年前
        1
  •  1
  •   Walter A    8 年前

    在第二个字段上排序并获取唯一的文件名:

    find ... | sort -t"." -k2,1 -r | 
       awk -F. '$1!=lastname {lastname=$1; print $0; i++; if (i==2) exit}'
    

    当所有文件的文件长度相同时,可以使用

    find ... | sort -t"." -k2,1 -r | uniq -w7
    
        2
  •  1
  •   RomanPerekhrest    8 年前

    易于理解的 排序 :

    find . -name 'L_*.[J-Z]' -printf "%f\n" | sort -t'.' -k2,2r
    
        3
  •  1
  •   Community Mohan Dere    5 年前
    echo "L_58420.K
    L_58420.J
    L_58420.M
    L_46657.J
    L_58420.N
    L_58420.P
    L_46657.N
    L_58420.Q
    L_46657.K
    L_58420.O
    L_46657.O
    L_46657.L
    L_46657.M
    L_58420.L" | sed 's/[_.]/ /g' | sort -r -k 2 -k 3 |  while read L no c ; do if [[ "$no" != "$last" ]]; then echo L_$no.$c; last=$no; fi; done; 
    L_58420.Q
    L_46657.O
    

    Sed在和处拆分字符串。分为多个部分,因此排序可以按键2(数字)和3(尾随字符)排序。while循环读取常量L(忽略它)、no和c。如果它是新的$no,则打印它并将其作为新的$last。在输出中,我们注入和。再来一次。

    注释中澄清之前的旧解决方案:

    管道通过rev | sort-r | rev:

    echo "L_58420.K
    L_58420.J
    L_58420.M
    L_46657.J
    L_58420.N
    L_58420.P
    L_46657.N
    L_58420.Q
    L_46657.K
    L_58420.O
    L_46657.O
    L_46657.L
    L_46657.M
    L_58420.L" | rev | sort -r | rev 
    L_58420.Q
    L_58420.P
    L_46657.O
    L_58420.O
    L_46657.N
    L_58420.N
    L_46657.M
    L_58420.M
    L_46657.L
    L_58420.L
    L_46657.K
    L_58420.K
    L_46657.J
    L_58420.J
    

    这个 rev 反转一行, sort -r 反向(降序)排序并再次排序 修订版 将字符串恢复到正确的顺序。

    要将输出减少到两行,请添加管道 | head -n 2 直到最后。您可以将整个管道附加到find命令,但我不想在测试环境中生成所有这些文件名。:)

    推荐文章