对目录和文件进行排序

对目录和文件进行排序

我想使用find并对响应进行排序。我认为一个简单的管道find ... | sort就可以做到这一点,但排序行为很奇怪。为了简单起见,一个简单的文本文件:

asdf/2/22
asdf/2/01
asdf/20/0
asdf/20/1

我的预期结果是

asdf/2/01
asdf/2/22
asdf/20/0
asdf/20/1

或者

asdf/20/0
asdf/20/1
asdf/2/01
asdf/2/22

这并不重要,因为我只希望目录出现在组中。

这是我的尝试:

[root@linux6 ~]# cat sort_test | sort
asdf/20/0
asdf/2/01
asdf/20/1
asdf/2/22
[root@linux6 ~]# cat sort_test | sort -d
asdf/20/0
asdf/2/01
asdf/20/1
asdf/2/22
[root@linux6 ~]# cat sort_test | tr "/" "X" | sort
asdfX20X0
asdfX20X1
asdfX2X01
asdfX2X22
[root@linux6 ~]# cat sort_test | tr "/" "_" | sort
asdf_20_0
asdf_2_01
asdf_20_1
asdf_2_22
[root@linux6 ~]#

请注意,它仅适用于“X”。任何非字母数字字符似乎都会破坏输出。我还尝试了-s,-t '/'选项,输出没有变化。

sort似乎首先删除非字母数字字符,然后对行进行排序,即使我没有提到-d.没有alias可供排序的。

[root@linux6 ~]# which sort
/usr/bin/sort
[root@linux6 ~]# uname -a
Linux i-epg-appl1 3.10.0-229.14.1.el7.x86_64 #1 SMP Tue Sep 15 15:05:51 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@linux6 ~]# sort --version
sort (GNU coreutils) 8.22

答案1

首先,/在您的语言环境中进行排序时将被忽略(您会注意到,对于大多数语言环境,集合规范中除了最后一个权重之外的所有权重都/IGNOREGNU 系统上(在我的 Debian 系统<U002F> IGNORE;IGNORE;IGNORE;<U002F> # 45 //usr/share/i18n/locales/iso14651_t1_common)),因此排序asdf/20/0依据asdf/2/01是就像排序asdf200一样asdf201,就好像你曾经使用过一样-d

您可以将语言环境更改为 C,其中排序仅基于字节值(并且/恰好排序数字),所以asdf/2/01asdf/20/0按照之前的/排序进行排序,但是例如,0您仍然会遇到asdf/2反对的问题。asdf/10

在这里,您可以使用 GNU 特定的-g/--general-numeric-sort选项,或者您可以这样做:

sort -nt/ -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 -k6,6 -k7,7 -k8,8 -k9,9

将每个目录组件视为一个数字(这将在前面排序 2_

使用zsh,您可以执行以下操作:

printf '%s\n' **/*(Dn)

进行递归的全局数字排序。

答案2

因此,为了总结这个问题,答案是设置LC_COLLATE为评论中提到的@don_crissti:

$ LC_COLLATE=C sort infile

相关内容