根据包含数字的名称对文件进行排序

根据包含数字的名称对文件进行排序

我的系统中有这样的文件-

-rw-r--r-- 1 abc     abcadm  14852497 Jul 23 01:11 ABCD_72_3_20210722_163502.csv
-rw-r--r-- 1 abc     abcadm  14853145 Jul 23 01:11 ABCD_72_1_20210722_163502.csv
-rw-r--r-- 1 abc     abcadm  14839699 Jul 23 01:11 ABCD_72_2_20210722_163502.csv
-rw-r--r-- 1 abc     abcadm  14842673 Jul 23 01:11 ABCD_72_5_20210722_163502.csv
-rw-r--r-- 1 abc     abcadm  14843811 Jul 23 01:11 ABCD_72_4_20210722_163502.csv

我想对这些文件进行排序,只打印文件名,并按如下所示的方式排序:

ABCD_72_1_20210722_163502.csv
ABCD_72_2_20210722_163502.csv
ABCD_72_3_20210722_163502.csv
ABCD_72_4_20210722_163502.csv
ABCD_72_5_20210722_163502.csv

我正在使用以下命令按升序排序并仅打印名称,但列表未排序。

ls -l | ABCD_72_[0-9]*_20210722_163502* | awk '{print $9}' | sort

请指出我错在哪里或者还有其他方法吗?

答案1

首先,不要解析 的输出ls。我们可以修改答案另一个问题稍微让它变成非递归的,然后find ./ -maxdepth 1 -printf "%f\n",并且你想要它排序,所以把它放到管道中sort。最后的命令是

$ find ./  -maxdepth 1 -printf "%f\n" | sort

正如@Rinzwind 指出的那样,如果您想要按数字排序(因此2可以放在之前12),请将--numeric-sort其添加到命令的末尾。

find ./  -maxdepth 1 -printf "%f\n" | sort --numeric-sort

答案2

你有没有考虑过

ls -v -1

这也可以自然地与文件规范一起使用,例如:

ls -v -1 ABCD*

或者

ls -v -1 A*.csv

答案3

如果切换到zsh,则可以使用它的数字 glob 限定符:

   n      sets the NUMERIC_GLOB_SORT option for the current pattern

(请参阅Glob Qualifiers部分FILENAME GENERATIONman zshexpn

前任。

 % print -rC1 ABCD_*.csv(n)
ABCD_72_1_20210722_163502.csv
ABCD_72_2_20210722_163502.csv
ABCD_72_3_20210722_163502.csv
ABCD_72_4_20210722_163502.csv
ABCD_72_5_20210722_163502.csv

或(按相反的数字顺序)

 % print -rC1 ABCD_*.csv(nOn)
ABCD_72_5_20210722_163502.csv
ABCD_72_4_20210722_163502.csv
ABCD_72_3_20210722_163502.csv
ABCD_72_2_20210722_163502.csv
ABCD_72_1_20210722_163502.csv

相关内容