Bash,根据带有数字和字符串的文件名列出文件

时间:2019-02-15 17:42:54

标签: linux bash

我正在尝试根据文件名对文件进行排序 首先根据数字排序,然后根据其字母进行排序。 数字是年龄,因此成年人将是最后一个。 如果使用相同的数字,则根据rep1,rep2和rep 3进行排序

原始文件是这样的

abc.0.5
abc.1.2
abc.15.3
abc.2.3
abc.35.5dpp
abc.35.5dpp.rep2
abc.7.3
abc.adult
abc.adult.rep2
abc.adult.rep3

结果应该是

abc.0.5
abc.1.2
abc.2.3
abc.7.3
abc.15.3
abc.35.5dpp
abc.35.5dpp.rep2
abc.adult
abc.adult.rep2
abc.adult.rep3

我尝试过

ls -v a*| sed 's/\.adult\./.99./' | sort -V | sed 's/\.99\./.adult./'

但是,如果数字和成人后面有dpp或rep,它将无法正确排序。

3 个答案:

答案 0 :(得分:2)

如果您想强制adult到最后,只需执行两个独立的批处理就将其移到末尾,一个是包含该字符串的文件名,另一个是不包含< / em>。那就是:

shopt -s extglob nullglob
print_lines() { (( $# )) && printf '%s\n' "$@"; }

{ print_lines abc!(*adult*) | sort -V; print_lines abc*adult* | sort -V; }

答案 1 :(得分:0)

我想你想要

ls -v a* | sed 's/\.adult\./.99./' | sort -t. -k2,2n -k3,3n | sed 's/\.99\./.adult./'

答案 2 :(得分:0)

这是工作

ls -l abc* | awk '{print $9}'| sed 's/\.adult/.99/' | sort -V  | sed 's/\.99/.adult/'