在文件扩展名中查找具有最高字母字符的文件
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
如何找到文件扩展名中字母最大的文件? 我的应用程序创建的文件示例:
$ 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