我想使用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
首先,/
在您的语言环境中进行排序时将被忽略(您会注意到,对于大多数语言环境,集合规范中除了最后一个权重之外的所有权重都/
在IGNORE
GNU 系统上(在我的 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/01
会asdf/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