在文件扩展名中查找具有最高字母字符的文件

find file with highest alphabet character in file extension

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

$ 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

仅当具有前一个字符的文件已经存在时才会创建更高的字母字符,因此也可以按日期 search/sort。

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(忽略它)、a no 和 c。打印,如果它是一个新的 $no 并保持它作为新的 $last。在输出中,我们注入 _ 和 .又回来了。

评论中澄清之前的旧解决方案:

通过 rev |排序-r |转:

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 反转(降序)排序并再次 rev 将字符串恢复到正确的顺序。

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

简单排序:

find . -name 'L_*.[J-Z]' -printf "%f\n" | sort -t'.' -k2,2r

按第二个字段排序并获得唯一的文件名:

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

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

find ... | sort -t"." -k2,1 -r | uniq -w7