macOS终端:`ls`首先使用大写名称对结果进行排序

时间:2018-12-18 13:13:33

标签: macos shell unix terminal

如何在macOS终端中为ls修复此默认排序行为?我希望结果不区分大小写并且按字母顺序排列。

这里是一个示例,用于说明在具有以下文件/目录的目录中运行ls时的当前行为和所需行为:Apple_,apple,Basket_,basket

当前行为:

Apple _

购物篮

苹果

购物篮

期望的行为:

Apple _

苹果

购物篮

购物篮


有人知道如何实现这一目标吗?

2 个答案:

答案 0 :(得分:2)

您可以这样排序:

$ mkdir testdir && cd testdir
$ touch apple basket Apple_ Basket_
$ ls | LC_COLLATE=C sort --ignore-case

输出(实际上不完全是预期的结果):

Apple
apple_
basket
Basket_

更新

要使其成为ls的默认行为,您可以将这段代码添加到文件~/.bash_profile中(在打开新的终端窗口后将生效):

ls_sort() {
  ls $1 | LC_COLLATE=C sort --ignore-case
}
alias ls='ls_sort'

实际上您可以在上面的最后一行中为别名lss而不是ls命名,这样您就不会失去ls的原始行为。

答案 1 :(得分:2)

@Yoric非常接近,但是他函数的内容有点错误:确实可以按字母顺序对结果进行排序,但是当使用`-la'标志时,它将弄乱“点”的顺序文件/目录(以点开头的文件/目录)。

我通过改写以下Stack Overflow帖子中的解决方案找到了正确的解决方案Making the "ls" command sort "a" before "B" (vs a->b->A->B)

步骤:

  1. 在主目录(~/)中打开/创建您的Shell配置文件。 (此文件在您每次启动Shell时都会自动运行)。这将是:

    • .bash_profile(如果未使用配置框架)
    • .zshrc(如果使用zsh
  2. 添加以下代码


ls_sort() {
  LC_COLLATE=en_US.utf8 ls "$@"
}

alias ls='ls_sort'

  1. 重启终端

感谢@Yoric帮助我获得此解决方案!