如何使“ ls”首先显示点文件?


46

一路上我搞砸了ls命令,现在我在运行时得到了这个命令

$ ls -AhHl --color=auto
-rwxr-xr-x 1 clang clang  640 Mar  1 02:46 apple-touch-icon-precomposed.png
-rwxr-xr-x 1 clang clang  784 Jul 12 02:54 crossdomain.xml
-rwxr-xr-x 1 clang clang 1.2K Mar  1 02:46 favicon.ico
drwxr-xr-x 8 clang clang 4.0K Jul 12 23:50 .git
-rw-r--r-- 1 clang clang   17 Feb 29 19:48 .gitignore
-rwxr-xr-x 1 clang clang 1.4K Jul 12 02:54 humans.txt

我该怎么做,使ls忽略了点文件,而是按首字母排序?

输出locale

$ locale
LANG=
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Answers:


47

尝试添加

export LC_COLLATE="C"

在您的dotfile中,或将LC_ALL分配更改为:

export LC_ALL="C"

这控制了字符级排序的工作方式-默认设置是内联对点文件进行排序,这将使sort列表点文件排在第一位。

但是,请注意,这将基本上停止所有支持区域设置的实用程序对您的实际区域设置的支持。


更进一步,引用GNU Coreutils手册(重点是我的):

如果您使用非POSIX语言环境(例如,通过设置LC_ALLen_US),则sort可能会产生与您习惯的输出排序不同的输出

在这种情况下,请将LC_ALL环境变量设置为C。请注意,设置仅LC_COLLATE存在两个问题。首先,如果LC_ALL也设置无效。其次,如果LC_CTYPE(或LANG,如果LC_CTYPE未设置)设置为不兼容的值,则它具有未定义的行为。例如,如果LC_CTYPE为is ja_JP.PCKLC_COLLATE则得到未定义的行为en_US.UTF-8


2
设置LC_ALL =“ C”就可以了!感谢您的快速反应
clang1234

7
设置LC_ALL =“ C”将ls外语(例如日语)unicode文件名设为????????
ohho 2013年

请注意,通过添加export LC_ALL="C"到点文件中,您会在所有支持区域设置的实用程序中实际上失去对实际区域设置的支持。虽然可以使用Faroul的答案来解决@ohho指出的打印问题,但您将引入排序问题:排序仅按字节值进行,导致排序(a)意外区分大小写,并且(b)总是放在重音字符。之后所有非重音符号的。
mklement0 2014年

35

为了避免在没有真正需要的情况下进行系统范围的更改,可以ls通过将别名添加到来仅更改当前用户的工作方式.bashrc

alias ll='LC_COLLATE=C ls -alF'

这将首先对点文件进行排序,允许正确处理(显示和排序)“西里尔字母”等“罕见”字符集。排序是区分大小写的唯一罪魁祸首。

来源:http//ubuntuforums.org/showthread.php?t = 816753


3
这是到目前为止最好的答案
工程师Dollery,2015年

美丽。比更改系统范围的配置要好得多(这可能会导致某些python模块出现问题)。
Gui Ambros

1
这是最有用的答案。另外,在LC_ALL已经设置为与ls列表顶部排序/提升点文件不兼容的环境中,请使用alias ll='LC_ALL=C ls -alF',因为LC_COLLATE它不会覆盖LC_ALL
马蒂

8

设置

LC_ALL="C.UTF-8"

对我来说效果很好-变音符号和“ ls -la”首先列出了点文件。


3
点文件首先列出,但是现在列出以大写字母开头的文件名,然后以小写字母开头的文件名被列出。
2014年

1
+1表示比可接受的答案更接近,但总结了一些局限性:排序将区分大小写,并且外来字符- 由于现在可以正确打印UTF-8 -不会正确排序
mklement0 2014年

3
C.UTF-8是无效的语言环境,因此语言环境会还原为C。您仍然会失去UTF-8支持。实际上,由于LC_ALL=C大多数程序正确显示了大多数多字节字符,但更糟的是,LC_ALL=something_invalid某些程序却不能正确显示(如`ls)。
马丁·图尔诺伊

@MartinTournoij,但是如果StéphaneChazelas对GNU系统(大概大概是Debian和Linux)另外说了,那是正确的吗?
大师

@muru我不确定,我想你得问问斯特凡?我所知道的一切locale似乎都是错误的LC_ALL=C.UTF-8gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 –在Arch Linux上。
Martin Tournoij

3

ls(1)联机帮助页列出:

-v文本中自然的(版本)数字排序

这似乎改变了句点的排序方式,并且首先对点文件进行了分组。我有:

alias ls='ls -vAF'
alias ll='ls -l'

在我的〜/ .bashrc中。


1

一个绝妙的主意

免责声明:这对你们大多数人来说都是过大了。但是我自1995年以来一直在这样做,我有能力使自己的世界完全符合我的需求。那么,我为什么不呢?

我真的很喜欢与使用不同的排序方法ls,尤其是-rt(通过r反向修改的time 排序)。因此,我决定尝试一些疯狂的事情,并使用awk进行排序。

# save as ~/.ls.awk
# inpsired by http://superuser.com/questions/448291/how-can-i-make-ls-show-dotfiles-first

{
    if($1 == "total"){
        print $0
        next
    }
    # may need to adjust $9 to match your name column
    if(match($9, /^(\033\[[0-9]*m)*\./)) # optionally look past xterm highlighting like: ^[[34m
        df[++dd] = $0
    else
        nf[++nn] = $0
}
END{
    while (++d in df)
        print df[d]
    while (++n in nf)
        print nf[n]
}

现在,我没有定义bash别名,而是定义了bash函数(因为别名只能在末尾附加参数,但是函数可以在任何地方使用它们)

ll(){ CLICOLOR_FORCE=1 ls -lhA $* | awk -f ~/.ls.awk; }

看结果

让我们创建一些示例文件:

for n in 4 .4 3 .3 2 .2 1 .1; do touch $n; sleep 1; done

使用普通ls

$ ls -lA
total 8
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
$ ls -lArt

total 8
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1

使用我的用awk过滤的函数

$ ll
total 8
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4

$ ll -rt
total 8
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1

您可以在这里查看我的实现https://github.com/RichardBronosky/dotfiles/commit/6170c0a9

最重要的是,它是一个用于调整ls输出的框架。您可以使用该awk过滤器执行任何操作。您可能希望它是目录,然后是点文件,然后是其他所有内容。一旦知道了如何处理xterm颜色,就不会太困难。这完全取决于您。


-1

可以在.bashrc或/ etc / bashrc文件中尝试以下操作:

LS_OPTIONS='--color=tty -A -F -X -B -h -v -b -T 0 --group-directories-first';
export LS_OPTIONS;
alias ls='/bin/ls $LS_OPTIONS';

假定您正在运行ls的较新版本,该版本使用“ --group-directories-first”作为选项。您显然可以根据自己的喜好调整LS选项。


什么是--group-directories-first有“首秀点文件”与做?
G-Man说'Resstate Monica''De​​c
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.