Unix的'ls'按名称排序


127

您可以按名称对ls列表进行排序吗?


10
如果不是没有名称就按名称排序,则可能要检查ls是否已别名为其他名称,或者只是使用完整路径调用它来消除存在的别名。
tvanfosson

gnu-coreutils ls默认排序。您使用的是什么系统(正如其他人所问的那样)
Nick Fortescue

您确定要按名称而不是按类型排序(即首先是目录,然后是文件)吗?
curtisk

大写字母在小写字母之前,因此文件Z在文件a之前...我该如何解决?
ArtOfWarfare 2013年

手册页上写着“按字典顺序分别排序”。文件按照第一个字符排序:数值[0..9]和UPPER字符[... Z]和Lowe字符[... Z]
GürolCanbek

Answers:


131

我的ls默认按名称排序。你在看什么

man ls 状态:

List information about the FILEs (the current directory by default). Sort entries alpha‐betically if none of -cftuvSUX nor --sort is specified.


ls如果-c1指定则不排序:有没有办法做到这一点?(--sort=name似乎无效)
dhc 2015年

1
那是不对的。与ls -la,我看到:.bashrc - can - .config - Downloads - .local - tmp,排序名称将是:.bashrc - .config - .local - Downloads - can - tmp
12431234123412341234123 '17

1
我说100.jpg在10.jpg之前。我猜是否“ 0”在“。”之前是有道理的。但是它仍然不直观
chiliNUT

我在“ b”之前看到“ M”。困惑。等一下,大写重要吗?
丹尼尔·斯普林格

105

对于简单的事情,可以将lssort结合使用。仅列出文件名:
ls -1 | 分类

以相反的顺序对它们进行排序:
ls -1 | 排序-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.1之前的2.10.15
步步高

我正在Pidion设备上进行一些android开发,而ls不会自动排序,因此这非常有帮助!唯一的问题是,由于某种原因,它看起来像对软链接进行排序但不对文件进行排序
Mitch

在Mac上,第二个命令似乎可以缩短为ls -1r
Ash Ryan Arnwine '16

4
@BBK sort -V将按版本号排序,因此您得到.. 2.10.2; 2.10.15;.. from man sort .. --sort = WORD将根据WORD排序:普通数字-g,人类数字-h,月份-M,数字-n,随机-R,版本-V
莫什

35

lscoreutils执行一个区域识别排序缺省,并且因此可以产生在一些情况下令人惊讶的结果(例如,%foo将间排序barquuxLANG=en_US)。如果要ASCIIbetical排序,请使用

LANG=C ls

LANGilfnuence的排序行为,此帖子对我有很大帮助!
yurenchen '16

这也为我工作。你能详细说明一下吗?为什么排序不同?
科斯塔斯

1
此剂量有效,但是?当输出是终端时,对于每个非ASCII字符输出(ls的错误功能会检查它是否输出到终端,在配管时起作用)。您可以使用管道将其“修复”到目录,使用C.UTF-8语言环境(如果系统支持)和/或使用-b标志。更好的是,根本不要使用ls,最好使用`
12431234123412341234123'9

这有助于我发现对我来说,问题在于我的某些文件名包含连字符(-),而某些包含破折号(–)。ls在连字符前对连字符进行排序。
杰米·马哈比

17

* 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,99将列排序到column 9,即文件名。您必须提供在哪里停止,在这种情况下,这是同一列。列以开头1

另外,如果要忽略大写/小写,请添加--ignore-case到sort命令。


1
什么-k9,9意思
luckydonald

找出来,意味着将列排序9到同一列9。正常ls输出如下所示:drwx------ 8 999 user 4.0K Feb 5 2017 file.txt,因此第9列是文件名。如果要忽略大小写,请使用--ignore-case排序。
luckydonald

8

注意:“ a”在“ Z”之后:

$ touch A.txt aa.txt Z.txt

$ ls

A.txt Z.txt aa.txt


3
这并非总是如此。我不完全了解导致这种情况不成立的情况,但是在运行Ubuntu 12.04的计算机上,ls的输出按字母顺序排序(忽略大小写)。
帕特里克·詹姆斯·麦克杜格

接得好!好像它是基于ASCII码排序吧..大写字母后跟小写..
肯特·帕瓦尔

1
我注意到,我的MacOS首先对数字进行排序,然后对大写字母,下划线和小写字母进行排序。有趣的是,它们不区分大小写。另一方面,我的Debian是区分大小写的,但是除非有平局,否则它会不区分大小写地对字母进行排序,那么小写字母将获胜!例如:ABA.txt ABb.txt aBC.txt AbC.txt ABc.txt
zk82 2013年

我也在MAC上。我很失望地看到A,Z,a,z类型的排序。我在这里是因为我更喜欢A,a,Z,a。谢谢你的小费。将在normal这里尝试解决方案。
nyxee

8

只有数字字符串不同的文件可以在此数字前排序,但必须以分隔符排序。

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

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

4

从手册页(对于bash ls):

如果-cftuSUX或--sort都没有,则按字母顺序对条目进行排序。


3
没有“ bash ls”。做“哪一个”
诺伯特·哈特尔

@诺伯特:您是正确的,但是which ls即使bash具有内置的ls也会成功。相反,执行builtin lsbash并得到一个错误。
侏罗纪

4
@Norbert:which始终返回路径。使用type ls来确定壳的想法ls是(内置的功能,可执行文件)。
迅速

3

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

22027:它将根据当前语言环境中的整理顺序分别对目录和非目录操作数进行排序。

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

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


2

ls -X可用于此目的,以防您将ls别名为更有用的默认值。


0
In Debian Jessie, this works nice:

ls -lah --group-directories-first

# l=use a long listing format
# a=do not ignore entries starting with .
# h=human readable
# --group-directories-first=(obvious)
# Note: add -r for reverse alpha

# You might consider using lh by appending to ~/.bashrc as the alias:
~$ echo "alias lh='ls -lah --group-directories-first'" >>~/.bashrc
# -- restart your terminal before using lh command --
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.