按名称对“ls”输出进行排序

177

你能按名称对 ls 列表进行排序吗?


13
如果没有任何参数按名称排序,你可能需要检查ls是否已被别名替代,或者仅使用完整路径调用它,这将消除任何现有的别名。 - tvanfosson
你确定要按名称排序而不是按类型排序(例如,先目录再文件)吗? - curtisk
1
大写字母在小写字母之前,因此文件Z在文件a之前...我该如何解决这个问题? - ArtOfWarfare
1
手册中说“分别按字典顺序排序”。文件根据第一个字符进行排序:数字[0..9]、大写字母[A..Z]和小写字母[a..z]。 - Gürol Canbek
1
@user770 使用“alias”命令(不带任何参数)列出您设置的任何别名,https://en.wikipedia.org/wiki/Alias_(command) - tvanfosson
显示剩余3条评论
15个回答

151

默认情况下,我的ls按名称进行排序。你看到了什么?

man ls说明:

如果没有指定 -cftuvSUX 或者 --sort,则列出关于FILEs(默认为当前目录)的信息。以字母顺序排序条目。


5
不是真的。通过执行 ls -la 命令,我看到:.bashrc - can - .config - Downloads - .local - tmp,按名称排序应为:.bashrc - .config - .local - Downloads - can - tmp - 12431234123412341234123
1
我的意思是100.jpg在10.jpg之前。如果“0”在“.”之前,这似乎是有道理的,但仍然不太直观。 - chiliNUT
@dhc - ls -c1 按创建时间排序(即对inode的最后更改时间,而不是出生时间),从新到旧,在单列中。 ls -cl 会失去这种排序顺序,除非您使用 ls -clt。 如果您不想按创建时间排序,请不要在没有 -l 的情况下使用 -c - Adam Katz
尽管这不是正确的ASCII排序顺序,但我看到“_”出现在“1”之前。我还发现基于是否有文件扩展名存在不一致性(例如,“A”在“A1”之前,但“A.jpg”在“A1.jpg”之后)!!! - Michael
@Michael 这不是基于 ASCII 排序,而是基于所在地区的排序规则。 - Evert
显示剩余3条评论

149

如果只是要列出文件名,可以将 lssort 结合起来。

ls -1 | sort

要以相反的顺序对它们进行排序:

ls -1 | sort -r

3
有没有一种方法可以像这样对文件进行排序:ls | sort -n,如下所示: 1.1.1; 1.1.2; 1.1.3; 2.10.1; 2.10.15; 2.10.2; 2.10.20; 2.10.21; 2.1.1; 2.1.10; 2.1.15; 2.1.2; 2.1.3; 2.1.4; 10.1.1; 10.1.2; 10.1.3; 11.0.1; 11.0.2; 11.0.20; 11.0.21; 11.0.22; 正如您看到的,2.10.15排在2.10.2之前 - BBK
我正在Pidion设备上进行一些Android开发,ls命令不会自动排序,所以这篇文章非常有帮助!唯一的问题是它似乎会对软链接进行排序,但出于某种原因不会对文件进行排序。 - Mitch
2
在Mac上,第二个命令可以简写为 ls -1r - Ash Ryan Arnwine
6
@BBK sort -V 将按照版本号排序,因此您将得到 .. 2.10.2; 2.10.15; .. 从 man sort 中.. --sort=WORD 将根据 WORD 进行排序:通用数值-g、人类可读的数字-h、月份-M、数值-n、随机-R、版本号-V。请注意,按版本号排序时,2.10.15 将排在 2.10.2 的前面,因为版本号是按每个部分进行比较而不是作为一个整体比较的。 - mosh
我最近注意到在某台机器上,“ls -1”有时会以无序的方式返回名称。例如:$ ls -l tmp read_csv.fxl read.fxl read_ssv.fxl这显然是无序的,因为“.” < “_”,所以如果按排序顺序排列,read.fxl将首先出现。我有点惊讶/bin/ls没有一个选项,只是意味着“按名称排序”。请注意,我使用的是“ls -1”,即数字ONE,而不是“ls -l”,它确实按名称排序。 - Patrick Chkoreff

51

coreutils 中的 ls 命令默认执行一个本地化感知排序,因此在某些情况下可能会产生令人惊讶的结果(例如,在 LANG=en_US 的情况下,%foo 将在 barquux 之间排序)。如果您想进行 ASCIIbetical 排序,请使用

LC_ALL=C ls

LANG 影响排序行为,这篇文章对我帮助很大! - yurenchen
这对我也起作用。你能详细说明一下吗?为什么它排序不同? - Kostas
3
这种方法能够起作用,但在输出为终端时(ls的一个缺陷是要检查是否输出到终端),对于每个非 ASCII 字符都会输出 ?。你可以通过将其管道化到 cat、使用 C.UTF-8 区域设置(如果系统支持)和/或使用 -b 标志来“修复”这个问题。更好的方法是不要使用 ls,而是使用 find 命令。 - 12431234123412341234123
这帮助我发现对我来说问题在于我的一些文件名包含连字符(-),而另一些则包含短划线(–)。ls将连字符排在短划线之前。 - Jamy Mahabier
1
我不得不设置LC_ALL=C才能使其正常工作,因为在ls文档中建议这样做。根据此答案更改LANG或LC_COLLATE对我没有用(GNU coreutils 8.32)。 - zazke

27
*nix工具的美妙之处在于你可以将它们组合使用。
ls -l | sort -k9,9

ls -l 的输出结果会像这样:

-rw-rw-r-- 1 luckydonald luckydonald  532 Feb 21  2017 Makefile
-rwxrwxrwx 1 luckydonald luckydonald 4096 Nov 17 23:47 file.txt
所以使用9,9,你将按列9对文件名进行升序排列,需要提供停止排序的位置,这种情况下是相同的列。 列从1开始计数。
另外,如果你想忽略大小写,可以在sort命令中添加--ignore-case选项。

3
“-k9,9” 是什么意思? - luckydonald
1
发现,它意味着将列9排序到相同的列9。正常的ls输出看起来像这样:drwx------ 8 999 user 4.0K Feb 5 2017 file.txt,因此第9列是文件名称。如果你想忽略大小写,在排序时使用--ignore-case - luckydonald

17

如果文件只有一个数字字符串不同,可以通过该数字进行排序,前提是它前面有分隔符。

在这种情况下,可以使用以下语法:

ls -x1 file | sort -t'<char>' -n -k2

例子:

ls -1 TRA*log | sort -t'_' -n -k2

TRACE_1.log
TRACE_2.log
TRACE_3.log
TRACE_4.log
TRACE_5.log
TRACE_6.log
TRACE_7.log
TRACE_8.log
TRACE_9.log
TRACE_10.log

正好正在寻找这样的东西。谢谢! - Emoon

8
注意:“a”在“Z”之后。
$ touch A.txt aa.txt Z.txt 

$ ls

A.txt Z.txt aa.txt

(文件名)

4
这并不总是正确的。我不确定是什么情况导致这种情况不成立,但在我的运行Ubuntu 12.04的计算机上,ls命令的输出按字母顺序排序(不区分大小写)。 - Patrick James McDougle
不错!看起来它是基于ASCII码进行排序.. 大写字母排在小写字母后面.. - Kent Pawar
1
我注意到我的MacOS会先排序数字,然后是大写字母,再是下划线和小写字母。有趣的是它们不区分大小写。另一方面,我的Debian是区分大小写的,但它对字母的排序不区分大小写,除非存在平局,那么小写字母胜出! 例如: ABA.txt ABb.txt aBC.txt AbC.txt ABc.txt - zk82
我也在用MAC。看到A,Z,a,z这种排序方式,我感到很失望。我来这里是因为我更喜欢A,a,Z,a的排序方式。谢谢你的提示,我会尝试这里的“normal”解决方案。 - nyxee

4

从bash ls的手册中可以得知:

如果没有使用-cftuSUX或--sort,那么按字母顺序对条目进行排序。


4
没有"bash ls"。请执行"which ls"命令。 - Norbert Hartl
@Norbert:你说得对,但是即使bash有一个内置的ls,which ls也会成功。相反,在bash中执行builtin ls,会得到一个错误。 - Pianosaurus
5
"which" 始终返回一个路径。使用 "type ls" 命令确定 shell 认为的 "ls" 是什么类型(内置、函数、可执行文件)。 - ephemient

3

ls实用程序应符合IEEE Std 1003.1-2001 (POSIX.1)的规定:

22027: 根据当前语言环境的排序顺序,它应该将目录和非目录操作数分别排序。

26027: 默认情况下,格式未指定,但输出应按符号名称字母顺序排序:

  • 如果指定了−A,则为库或对象名称
  • 符号名称
  • 符号类型
  • 符号的值
  • 与符号相关联的大小(如果适用)

3

如果您已经将ls别名设置为更有用的默认值,则可以使用ls -X来实现此目的。


2

请检查您的.bashrc文件中的别名。


8
可输入alias命令,查看所有当前别名。 - Krzysztof Jabłoński

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接