给定一个 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/