Unix (Solaris) 类型的 ls -l 输出,带有数字名称

标签 unix sorting ls

给定一个 ls -l作为软件发布版本的目录列表,如何分类为人类喜欢的形式?例如:

$ ls -loghF
共计 209
drwxr-xr-x 2 18 年 6 月 3 日 11:33 12.0.40.0/
drwxr-xr-x 2 8 月 24 日 14:45 13.0.11.10/
drwxr-xr-x 2 13 年 7 月 3 日 14:12 13.0.11.4/
drwxr-xr-x 2 7 月 26 日 15:30 13.0.11.5/
drwxr-xr-x 2 7 月 27 日 11:33 13.0.11.6/
drwxr-xr-x 2 月 3 日 8 月 3 日 11:41 13.0.11.7/
drwxr-xr-x 2 10 年 8 月 3 日 11:53 13.0.11.8/
drwxr-xr-x 2 17 年 8 月 3 日 17:00 13.0.11.9/
drwxr-xr-x 2 8 月 3 日 14:37 13.0.17.0/
drwxr-xr-x 2 13 年 8 月 3 日 11:50 13.0.18.0/
drwxr-xr-x 2 17 年 8 月 3 日 11:21 13.0.19.0/
drwxr-xr-x 2 7 月 28 日 15:00 13.0.9.1/

期望的结果是:

$ ls -loghF |种类 ...
共计 209
drwxr-xr-x 2 18 年 6 月 3 日 11:33 12.0.40.0/
drwxr-xr-x 2 7 月 28 日 15:00 13.0.9.1/
drwxr-xr-x 2 13 年 7 月 3 日 14:12 13.0.11.4/
drwxr-xr-x 2 7 月 26 日 15:30 13.0.11.5/
drwxr-xr-x 2 7 月 27 日 11:33 13.0.11.6/
drwxr-xr-x 2 月 3 日 8 月 3 日 11:41 13.0.11.7/
drwxr-xr-x 2 10 年 8 月 3 日 11:53 13.0.11.8/
drwxr-xr-x 2 17 年 8 月 3 日 17:00 13.0.11.9/
drwxr-xr-x 2 8 月 24 日 14:45 13.0.11.10/
drwxr-xr-x 2 8 月 3 日 14:37 13.0.17.0/
drwxr-xr-x 2 13 年 8 月 3 日 11:50 13.0.18.0/
drwxr-xr-x 2 17 年 8 月 3 日 11:21 13.0.19.0/

排序必须跳过每行的日期部分,然后使用“.”按数字排序(例如,从 12 或 13 开始)。作为字段分隔符。

我想到了两种方法,但是如果完全支持 sort -k 语法,我会遇到困难:

(1) 跳过前 36 个字符,然后使用 '.'作为字段分隔符,对接下来的 4 个字段进行数字排序。

(2) 以字段分隔符为空格,跳到第7个字段,然后将字段分隔符更改为'.'并对接下来的 4 个字段进行数字排序。

替代方案是一个小的 Perl 脚本,但 Unix 排序不能完成这个“简单”任务吗?

最佳答案

这是一个使用 awk 的命令行将版本号放在首位,使用四个数字键排序,然后使用 cut摆脱前面的临时:

$ ls -loghF | awk '{ print $7, $0; }' | sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4 | cut -d' ' -f2-
drwxr-xr-x   2       3 Jun 18 11:33 12.0.40.0/
drwxr-xr-x   2       3 Jul 28 15:00 13.0.9.1/
drwxr-xr-x   2       3 Jul 13 14:12 13.0.11.4/
drwxr-xr-x   2       3 Jul 26 15:30 13.0.11.5/
drwxr-xr-x   2       4 Jul 27 11:33 13.0.11.6/
drwxr-xr-x   2       3 Aug  3 11:41 13.0.11.7/
drwxr-xr-x   2       3 Aug 10 11:53 13.0.11.8/
drwxr-xr-x   2       3 Aug 17 17:00 13.0.11.9/
drwxr-xr-x   2       3 Aug 24 14:45 13.0.11.10/
drwxr-xr-x   2       3 Aug  3 14:37 13.0.17.0/
drwxr-xr-x   2       3 Aug 13 11:50 13.0.18.0/
drwxr-xr-x   2       3 Aug 17 11:21 13.0.19.0/

那里的排序命令是从 this answer 借来的。 .另一个答案建议 sort -V (版本排序),但我的 sort 版本没有它(不过你可能有,所以值得一试)。版本排序可能特定于较新的 GNU coreutils(我的 Linux 机器有它,排序来自 GNU Coreutils 8.5)。

使用版本排序:
$ ls -loghF | sort -k7,7V
drwxr-xr-x   2       3 Jun 18 11:33 12.0.40.0/
drwxr-xr-x   2       3 Jul 28 15:00 13.0.9.1/
drwxr-xr-x   2       3 Jul 13 14:12 13.0.11.4/
drwxr-xr-x   2       3 Jul 26 15:30 13.0.11.5/
drwxr-xr-x   2       4 Jul 27 11:33 13.0.11.6/
drwxr-xr-x   2       3 Aug  3 11:41 13.0.11.7/
drwxr-xr-x   2       3 Aug 10 11:53 13.0.11.8/
drwxr-xr-x   2       3 Aug 17 17:00 13.0.11.9/
drwxr-xr-x   2       3 Aug 24 14:45 13.0.11.10/
drwxr-xr-x   2       3 Aug  3 14:37 13.0.17.0/
drwxr-xr-x   2       3 Aug 13 11:50 13.0.18.0/
drwxr-xr-x   2       3 Aug 17 11:21 13.0.19.0/

关于Unix (Solaris) 类型的 ls -l 输出,带有数字名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12136360/

相关文章:

linux - 需要验证变量的长度并在 unix 中执行相应的操作

arrays - 如何快速交换两个日期

arrays - 从多个数组中提取信息

bash - 如何检查终端中现有的 docker 镜像?

javascript - 如何使用 jquery 根据标签文本升序对多个下拉列表进行排序

java - 如何对 recyclerView 进行分组,在组之间添加分隔线并为每个组添加一个图标

ubuntu - 命令的颜色突出显示(Ubuntu 突出显示到 Debian)?

bash - 什么是 ls -F (ls --classify)

bash - 在 bash ls 别名中使用星号

python - 将信息从一个脚本传递到另一个脚本