Unix 的 'ls' 按名称排序

Posted

技术标签:

【中文标题】Unix 的 \'ls\' 按名称排序【英文标题】:Unix's 'ls' sort by nameUnix 的 'ls' 按名称排序 【发布时间】:2010-10-27 01:37:58 【问题描述】:

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

【问题讨论】:

如果它没有按名称排序,没有任何参数,您可能想检查 ls 是否已被别名为其他东西,或者只是使用完整路径调用它,这将消除任何存在的别名。跨度> gnu-coreutils ls 默认排序。您使用的是什么系统(正如其他人所要求的) 您确定要按名称而不是按类型排序(即先目录然后文件)?? 大写字母在小写字母之前,因此文件 Z 在文件 a 之前...我该如何解决? 手册页显示“按字典顺序单独排序”。文件按第一个字符排序:数字 [0..9] 和大写字符 [A..Z] 和小写字符 [a..z] 【参考方案1】:

我的 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 似乎不起作用) 这不是真的。使用ls -la,我看到:.bashrc - can - .config - Downloads - .local - tmp,排序名称将是:.bashrc - .config - .local - Downloads - can - tmp 我说 100.jpg 在 10.jpg 之前。有道理我猜如果“0”出现在“。”之前但它仍然不直观 我在“b”之前看到“M”。使困惑。等等,大小写重要吗? @dhc – ls -c1 按创建时间(对 inode 的最后一次更改,出生时间)、最新到最旧的单列排序。除非您使用 ls -clt,否则 ls -cl 会丢失该排序顺序。如果不想按创建时间排序,请不要在没有-l的情况下使用-c【参考方案2】:

对于一些简单的事情,您可以将 lssort 结合使用。对于文件名列表:

ls -1 | sort

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

ls -1 | sort -r

【讨论】:

有没有办法像这样对文件进行排序:ls | sort -n1.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 我在 Pidion 设备上做一些 android 开发,并且 ls 不会自动排序,所以这非常有帮助!唯一的问题是它看起来像是对软链接进行排序,但由于某种原因没有对文件进行排序 在 Mac 上,第二条命令似乎可以缩短为 ls -1r @BBK sort -V 将按版本号排序,所以你得到 .. 2.10.2; 2.10.15; .. from man sort .. --sort=WORD 将根据 WORD 进行排序:general-numeric -g, human-numeric -h, month -M, numeric -n, random -R, version -V【参考方案3】:

ls from coreutils 默认执行 locale-aware 排序,因此在某些情况下可能会产生令人惊讶的结果(例如,%foo 将在 bar 和 @ 之间排序987654325@LANG=en_US)。如果你想要一个 ASCIIbetical 排序,使用

LANG=C ls

【讨论】:

LANG 排序行为,这篇文章对我有很大帮助! 这对我也有用。你能详细说明一下吗?为什么排序不同? 这个剂量有效,但是当输出是终端时,为每个非 ascii 字符输出?(ls 的坏功能确实检查它是否输出到终端,在管道时工作)。你可以通过管道“修复”这个问题,使用C.UTF-8 语言环境(如果你的系统支持它)和/或使用-b 标志。更好的是,根本不要使用ls,最好使用` 这帮助我发现,对我来说,问题在于我的一些文件名包含连字符 (-) 和一些破折号 (-)。 ls 在破折号前对连字符进行排序。【参考方案4】:

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

另外,如果您想忽略大小写,请将--ignore-case 添加到排序命令中。

【讨论】:

-k9,9 是什么意思? 发现,意思是把9列排到同一列9。正常的ls 输出如下所示:drwx------ 8 999 user 4.0K Feb 5 2017 file.txt,因此第 9 列是文件名。如果您想忽略大小写,请在排序时使用--ignore-case【参考方案5】:

仅通过数字字符串不同的文件可以在该数字前面带有分隔符的情况下按该数字排序。

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

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

【讨论】:

正在寻找类似的东西。谢谢!【参考方案6】:

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

$ touch A.txt aa.txt Z.txt 

$ ls

A.txt Z.txt aa.txt

【讨论】:

这并不总是正确的。我不完全知道导致这不正确的情况,但在我运行 Ubuntu 12.04 的机器上, ls 的输出按字母顺序排序(忽略大小写)。 好收获!好像是根据 ASCII 码排序的。。大写字母后跟小写字母。。 我注意到我的 MacOS 先排序数字,然后是大写字母,然后是下划线,然后是小写字母。有趣的是它们不区分大小写。另一方面,我的 Debian 区分大小写,但它对字母的排序不敏感,除非有平局,否则小写获胜!示例:ABA.txt ABb.txt aBC.txt AbC.txt ABc.txt 我也在 MAC 上。我很失望地看到 A、Z、a、z 类型的排序。我在这里是因为我更喜欢 A,a,Z,a。谢谢你的小费。将在这里试用normal 解决方案。【参考方案7】:

来自手册页(对于 bash ls):

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

【讨论】:

没有“bash ls”。做“哪个ls” @Norbert:你是对的,但是即使 bash 有内置的 ls,which ls 也会成功。而是在 bash 中执行 builtin ls 并得到一个错误。 @Norbert: which 总是返回一个路径。使用type ls 来确定shell 认为ls 是什么(内置、函数、可执行文件)。【参考方案8】:

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

22027:将目录和非目录操作数按照当前语言环境中的排序顺序分别排序。

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

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

【讨论】:

【参考方案9】:

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

【讨论】:

只需键入alias 即可检查所有当前别名。【参考方案10】:

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

【讨论】:

【参考方案11】:

你可以试试:

ls -lru

-u 和 -lt:按访问时间排序并显示;

【讨论】:

【参考方案12】:
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 --

【讨论】:

【参考方案13】:

我使用以下命令获得了按 name 排序的目录的内容:

ls -h

【讨论】:

ls 没有任何选项已经按名称排序,-h 只是以“人类可读”的形式打印大小之类的东西。

以上是关于Unix 的 'ls' 按名称排序的主要内容,如果未能解决你的问题,请参考以下文章

c++ 按字母顺序排序名称

使用 Linq 按名称频率对列表进行排序

按名称排序 FileSystemInfo[]

Elasticsearch 列表索引按名称排序

按姓氏排序的名称列表

Golang按名称排序切片[关闭]