Mac OSX中不区分大小写的ls排序


30

如何ls在Max OS X Lion 中使命令类似于Ubuntu Linux那样对文件和目录进行排序(不区分大小写,目录不在顶部,点文件不在顶部)?理想情况下,我希望在不将输出传递给另一个命令(例如sort)的情况下执行此操作。

例如,我想看:

foo
Foobar
MyStuff/
.stuff/
test.txt

代替:

.stuff
Foobar
MyStuff/
foo
test.txt

在Linux中,ls排序顺序由系统的语言环境控制,特别是LC_COLLATE。当时LC_COLLATE=en_US.UTF-8,ls将对我想要的项目进行排序。时LC_COLLATE=Cls将类似于OSX。

LC_COLLATEen_US.UTF-8在OS X中设置为,但ls仍采用旧POSIX方法。有谁知道我如何使它表现得更像Linux?


如果有帮助:apple.stackexchange.com/a/22304/8546观察到HFS Plus通常配置为不区分大小写,保留大小写
Graham Perrin

Answers:


16

可能不可能:

看一下ls源代码,它使用strcoll对文件名进行排序,因此应遵循LC_COLLATE。

在线上的一些帖子表明,与Linux中的语言环境相比,BSD(和Darwin / OS X)的语言环境有些混乱。我编写了一个自己的快速排序程序,该程序明确设置了语言环境,并在我的计算机(Mac OS 10.6.3)和大学计算机(Linux,FC11?)上使用en_US.UTF-8和C语言环境对其进行了测试。虽然在Linux机器上按预期进行排序(“ a B c”与“ b a c”),但mac总是将它们排序为“ B a c”。

资料来源:http : //ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

原始答案

此命令不对点文件进行排序,但显示其他目录列表

ls -f1 

我接近:

.
..
.stuff
foo
Foobar
MyStuff
test.txt

1
有趣的是,使用-f选项的“禁用排序”似乎实际上是按预期对它进行排序。我认为这是具有更“自然”排序规则的文件系统/ HFS +排序条目。
格里


4

这已经困扰了我好一阵子了,我终于把它整理好了(呵呵)。在尝试了一系列不可行的建议之后,这就是成功的方法。

如果您愿意安装MacPorts(或Homebrew或Fink),ls的GNU版本将完全满足您的需求。我本人使用MacPorts,因此将解释以下方法:

  1. 下载并安装MacPorts:

    http://www.macports.org

  2. 安装GNU Coreutils软件包:

    sudo port install coreutils

  3. 您现在应该拥有GNU ls :gls。在包含以大写和小写字母开头的项目的目录中尝试:

    gls -U

    (该-U选项实际上表示“未排序”,但在OS X上具有使其不区分大小写的预期效果。)

  4. 在您的别名中添​​加此别名,.bash_profile以便常规代码ls可以按您希望的方式工作(我喜欢颜色输出,但是如果需要可以忽略;您只需要使用即可-U):

    alias ls='gls -U --color'

请注意,该-U选项可能在其他平台上不起作用。在OS X中,它似乎总是做正确的事(也许是因为HFS +实际上不区分大小写-从技术上讲是“区分大小写”),但是如果在Linux机器上尝试,结果很可能不是排序。


1
3.由于新的APFS,在macOS> = 10.13下似乎不再具有所需的副作用(-U选项)。
Marius Hofert '17

1
是的...看起来没有任何方法可以使用APFS做到这一点。
杰森·西姆斯

确认确实适用于10.12。谢谢!
上校惊慌

4

除了Mike在上面写的内容之外,我还做了一些进一步的工作,找到了定义自己的排序规则的方法。

语言环境定义位于/ usr / share / locale /中。每个文件夹都是一个区域设置,并具有一个文件(或链接)LC_COLLATE,该文件定义哪些符号“相同”(例如,订购时应将U,u和ü视为相同)。您可以复制目录,这将创建一个新的语言环境定义:

$ sudo cp -R en_GB.UTF-8/ en_GB.UTF-8-CI/

现在,您将拥有一个名为“ en_GB.UTF-8-CI”(不区分大小写的“ CI”)的新语言环境,并且可以从此处使用LC_COLLATE。

现在,要更改新语言环境中的LC_COLLATE,您可以从http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/下载语言环境源 ,最接近您想要和运行的

$ colldef < <new collation file>
$ sudo cp LC_COLLATE /usr/share/locale/en_GB.UTF-8-CI/

现在当你跑步时

$ LC_COLLATE=en_GB.UTF-8-CI ls

您将根据自己的规则进行排序。

是的,这就是使'ls'排序不区分大小写的方法。


2

解决方法是使用函数和别名:

function lssorted() { /bin/ls "$@" | sort -f ;}
alias ls='lssorted'

这将为标准ls命令生成不区分大小写的排序输出。


1
我必须注意:如果使用-l,这将失败。然后ls在开头生成另一行“总计X”,该行也将被排序。
阿恩(Arne)

2

使用

ls -f

为我工作。

-f正式关闭任何排序,但是看起来像原始的HFS排序通过了一样,这完全是不区分大小写的排序。

我猜,这实际上取决于您是否对HD格式区分大小写,但是由于Mac OS X系统磁盘默认使用不区分大小写的HFS格式,因此大多数用户都可以使用。


这绝对是正确的答案。唯一的问题是它也隐式地打开-a,并且没有办法将其关闭,这将向您显示以/开头的文件/文件夹,包括。和..
lensovet 2014年

1
另一个问题(现在)是由于新的APFS,在macOS> = 10.13下似乎不再起作用。
Marius Hofert '17

1

受到Mike回答的启发,我在/ etc / bashrc中添加了以下内容,它在Mojave中可以很好地工作。添加-a时,它在末尾列出了隐藏文件,但这并不困扰我。

export LC_COLLATE="cs_CZ.ISO8859-2"; alias ls='ls -lhFG'

您可以通过运行locale命令来查看新配置。要还原,只需从/ etc / bashrc中删除该行,然后重新登录到终端。

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="cs_CZ.ISO8859-2"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

请注意,ls -f1和ls -f都不在Mojave中为我工作。我最终得到了一个真正未排序的清单。在Mojave中,只有我提供的解决方案对我有效。


最好的答案,但是给出的例子做得太多。应当缩小为:将以下行放入您的.bashrc.zshrcalias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561489

0

跑:

$ type ls

您可能会发现您的ls命令是别名。


在Linux上:ls is /bin/ls。在OS X上:ls is hashed (/bin/ls)。无论哪种方式,即使我/bin/ls直接调用它,也不会按照LC_COLLATE排序。

2
令人惊讶的是,我本来可以押注您的ls命令别名为include --group-directories-first。它可能仍然可以在其他地方完成,而不仅仅是别名。
2011年

0

如果您主要关注点文件的排序顺序,则可以按扩展名排序:使用带有选项lsGNU Fileutils中的命令--sort=extension。(您可以例如通过macports安装GNU Fileutils。)


0

ls是根据LC_COLLATE进行排序的,只是大多数LC_COLLATE文件都已设置为区分大小写。 http://collat​​ion-charts.org/fbsd54/

为区分大小写的排序设置了两种:cs_CZ.ISO8859-2和et_EE.ISO8859-15 et_EE.ISO8859.15不会像讲英语的人那样对“ Z”进行排序。cs.CZ.ISO8859-15在字母方面做得很好,我只希望它能在字母字符前排序“〜”。

我的解决方案是:LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

我想知道是否可以使自定义LC_COLLATE文件处理“。” 您想要的方式和“〜”我想要的方式。

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.