Como posso fazer com que "ls" mostre os dotfiles primeiro?

39

Em algum lugar ao longo do caminho, estraguei o comando ls e agora recebo essa ordem ao executar

$ 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

O que eu fiz que fez ls ignorar os dotfiles e, em vez ordenar pela primeira letra?

Saída de 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
    
por clang1234 13.07.2012 / 02:57

6 respostas

41

Tente adicionar

export LC_COLLATE="C"

nos seus arquivos de ponto ou alterando a atribuição de LC_ALL para:

export LC_ALL="C"

Isto controla a maneira como a ordenação funciona no nível do caractere - enquanto o padrão seria classificar os dotfiles em linha, isso fará com que sort listem os dotfiles primeiro.

No entanto, observe que isso basicamente interromperá o suporte para sua localidade real em todos os utilitários com reconhecimento de localidade.

Para ir além, citando o manual do GNU Coreutils (grifo meu) :

If you use a non-POSIX locale (e.g., by setting LC_ALL to en_US), then sort may produce output that is sorted differently than you're accustomed to.

In that case, set the LC_ALL environment variable to C. Note that setting only LC_COLLATE has two problems. First, it is ineffective if LC_ALL is also set. Second, it has undefined behavior if LC_CTYPE (or LANG, if LC_CTYPE is unset) is set to an incompatible value. For example, you get undefined behavior if LC_CTYPE is ja_JP.PCK but LC_COLLATE is en_US.UTF-8.

    
por 13.07.2012 / 03:12
29

Para evitar alterações em todo o sistema sem necessidade real, só é possível alterar a forma como ls funciona para o usuário atual adicionando o alias à .bashrc :

alias ll='LC_COLLATE=C ls -alF'

Isso classifica os arquivos de pontos primeiro, permite manipular adequadamente (mostrar e classificar) conjuntos de caracteres "incomuns", como o cirílico. O único culpado é que a classificação diferencia maiúsculas de minúsculas.

Fonte: link

    
por 18.01.2015 / 12:07
7

Configuração

LC_ALL="C.UTF-8"

funciona bem para mim - o umlauts e o "ls -la" listam os arquivos de pontos primeiro.

    
por 09.10.2013 / 23:08
1

Uma ideia de parede

Disclaimer: This is going to be overkill for most of you. But I've been doing this since 1995 and I have the skills to make my world exactly how I want it. So, I why not?

Eu realmente gosto de usar métodos de classificação diferentes com ls , especialmente -rt (que é classificado por r everse modificado t ime). Então, decidi tentar algo maluco e usar o awk para fazer minha classificação.

# 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, /^(3\[[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]
}

Agora, em vez de definir um alias bash, eu defino uma função bash (porque os aliases só podem acrescentar argumentos no final, mas as funções podem usá-los em qualquer lugar)

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

Para ver os resultados

Vamos criar alguns arquivos de amostra:

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

Usando ls simples

$ 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

Usando minha função que filtra com o 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

Você pode ver minha implementação disso aqui link

O mais importante sobre isso é que é uma estrutura para ajustar sua saída ls . Você pode fazer o que quiser com esse filtro do awk. Você pode querer que sejam diretórios, depois dotfiles e depois todo o resto. Depois de saber como lidar com as cores do xterm, não é muito difícil. É totalmente até você.

    
por 01.12.2016 / 06:43
1

As listas de man pages ls (1):

-v natural sort of (version) numbers within text

Isso parece alterar a forma como os períodos são classificados e agrupa os dotfiles primeiro. Eu tenho:

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

no meu ~ / .bashrc.

    
por 07.10.2018 / 09:51
-1

Pode tentar isto no seu arquivo .bashrc ou / 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';

Isso pressupõe que você esteja executando uma versão um pouco mais nova de ls que usa "--group-directories-first" como uma opção. Você pode, obviamente, ajustar as opções do LS ao seu gosto.

    
por 20.12.2017 / 06:27