Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix(Solaris)类型的ls-l输出,带有数字名称_Unix_Sorting_Ls - Fatal编程技术网

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

Unix(Solaris)类型的ls-l输出,带有数字名称,unix,sorting,ls,Unix,Sorting,Ls,给定一个ls-l目录列表,这些目录是软件发布版本,如何排序为人类更喜欢的形式?例如: $ ls -loghF total 209 drwxr-xr-x 2 3 Jun 18 11:33 12.0.40.0/ drwxr-xr-x 2 3 Aug 24 14:45 13.0.11.10/ 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

给定一个
ls-l
目录列表,这些目录是软件发布版本,如何排序为人类更喜欢的形式?例如:

$ ls -loghF total 209 drwxr-xr-x 2 3 Jun 18 11:33 12.0.40.0/ drwxr-xr-x 2 3 Aug 24 14:45 13.0.11.10/ 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 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/ drwxr-xr-x 2 3 Jul 28 15:00 13.0.9.1/ $ls-loghF 总数209 drwxr-xr-x 2 3 Jun 18 11:33 12.0.40.0/ drwxr-xr-x 2 3 Aug 24 14:45 13.0.11.10/ 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 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/ drwxr-xr-x 2 3 Jul 28 15:00 13.0.9.1/ 预期的结果是:

$ ls -loghF | sort ... total 209 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/ $ls-loghF |排序。。。 总数209 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/ 排序必须跳过每行的日期部分,然后使用“.”作为字段分隔符进行数字排序(例如,从12或13开始)

我想到了两种方法,但是如果支持sort-k语法的话,我在使用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/
那里的sort命令是借用自。另一个答案建议使用
sort-V
(version-sort),但我的
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/

下面是一个命令行,它使用
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/
那里的sort命令是借用自。另一个答案建议使用
sort-V
(version-sort),但我的
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/

这不是最快的方法,但解释起来相当简单:

ls -loghF |
awk '{ print $7 " " $0 }' |
sort -t. -k 1,1n -k 2,2n -k3,3n -k 4,4n |
sed 's/^[^ ]* //'
“awk”命令将目录字段复制到行的前面;sort命令只使用一个分隔符(
;我认为不能对行的不同部分使用不同的分隔符),然后按数字顺序显式地对4个数字部分进行排序。然后,
sed
删除前面添加的字段


这是“使
排序
更容易找到键”的一个简单版本,因为拆分输入是
排序
中代价高昂的操作之一。这不是最快的方法,但解释起来相当简单:

ls -loghF |
awk '{ print $7 " " $0 }' |
sort -t. -k 1,1n -k 2,2n -k3,3n -k 4,4n |
sed 's/^[^ ]* //'
“awk”命令将目录字段复制到行的前面;sort命令只使用一个分隔符(
;我认为不能对行的不同部分使用不同的分隔符),然后按数字顺序显式地对4个数字部分进行排序。然后,
sed
删除前面添加的字段


这是“使
排序
更容易找到键”的简单版本,因为在
排序
中拆分输入是一项昂贵的操作。仅供参考:以下是我最后要做的。
特别感谢:

$ls-loghF | perl-e'
严格使用;
我的@in=;
我的@out=grep(m |\d+\.\d+\.\d+\.\d+/$,@in);
打印排序{
我的@aa=$a=~
m |(\d+)\(\d+)\(\d+)\(\d+)/$|;
my@bb=$b=~
m |(\d+)\(\d+)\(\d+)\(\d+)/$|;
$aa[0]$bb[0]或
$aa[1]$bb[1]或
$aa[2]$bb[2]或
$aa[3]$bb[3]
}@out;
'
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 29 17:31 13.0.11.11/ 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/
仅供参考:以下是我最后做的事情。
特别感谢:

$ls-loghF | perl-e'
严格使用;
我的@in=;
我的@out=grep(m |\d+\.\d+\.\d+\.\d+/$,@in);
打印排序{
我的@aa=$a=~
m |(\d+)\(\d+)\(\d+)\(\d+)/$|;
my@bb=$b=~
m |(\d+)\(\d+)\(\d+)\(\d+)/$|;
$aa[0]$bb[0]或
$aa[1]$bb[1]或
$aa[2]$bb[2]或
$aa[3]$bb[3]
}@out;
'
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/