Como posso fazer com que "ls" mostre arquivos de ponto primeiro?

46

Em algum lugar ao longo do caminho, estraguei meu 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 isso fez com que eu ignorasse os arquivos de pontos e, em vez disso, ordenasse 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
clang1234
fonte

Respostas:

47

Tente adicionar

export LC_COLLATE="C"

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

export LC_ALL="C"

Isso controla a maneira como a classificação no nível de caractere funciona - enquanto o padrão seria classificar os arquivos de ponto em linha, isso fará com que os sortarquivos de lista sejam primeiro.

No entanto, observe que isso basicamente interromperá o suporte ao seu código de idioma real em todos os utilitários com reconhecimento de código de idioma.


Para ir além, citando o manual GNU Coreutils (ênfase minha):

Se você usar um código de idioma não POSIX (por exemplo, configurando LC_ALLpara en_US), a classificação poderá produzir uma saída classificada de maneira diferente da que você está acostumado.

Nesse caso, defina a LC_ALLvariável de ambiente como C. Observe que a configuração LC_COLLATEpossui apenas dois problemas. Primeiro, é ineficaz se LC_ALLtambém estiver definido. Segundo, ele tem um comportamento indefinido se LC_CTYPE(ou LANG, se LC_CTYPEnão estiver definido) estiver definido como um valor incompatível. Por exemplo, você obtém um comportamento indefinido se LC_CTYPEé ja_JP.PCKmas LC_COLLATEé en_US.UTF-8.

slhck
fonte
2
Definir LC_ALL = "C" fez o truque! Obrigado pela resposta rápida
clang1234 13/07/12
7
Definir LC_ALL = "C" vontade lsde língua estrangeira (por exemplo, japonês) os nomes de arquivo Unicode como????????
ohho
Observe que, ao adicionar export LC_ALL="C"aos seus arquivos de ponto, você perderá efetivamente o suporte à sua localidade real em todos os utilitários com reconhecimento de localidade. Embora o problema de impressão que @ohho aponte possa ser solucionado com a resposta de Faroul , você apresentará problemas de classificação : a classificação ocorrerá apenas pelo valor de byte, resultando em uma classificação que (a) é sensível a maiúsculas e minúsculas e (b) invariavelmente coloca caracteres acentuados. depois de todos os sem sotaque.
usar o seguinte comando
35

Para evitar alterações em todo o sistema sem necessidade real, é possível alterar apenas a maneira como lsfunciona para o usuário atual adicionando o alias ao .bashrc:

alias ll='LC_COLLATE=C ls -alF'

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

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

Andrey Loskutov
fonte
3
Esta é a melhor resposta aqui de longe
Engenheiro Dollery
Lindo. Muito melhor do que alterar a configuração do sistema (o que pode causar problemas em alguns módulos python).
Gui Ambros #
11
Essa foi a resposta mais útil. Além disso, em um ambiente em que LC_ALLjá esteja definido como algo incompatível com a classificação / elevação de arquivos de ponto na parte superior da lslista, use-o alias ll='LC_ALL=C ls -alF', pois LC_COLLATEnão substitui LC_ALL.
matty
8

Configuração

LC_ALL="C.UTF-8"

funciona bem para mim - trema e "ls -la" lista primeiro os arquivos de ponto.

Faroul
fonte
3
os arquivos de ponto são listados primeiro, mas agora os nomes de arquivo que começam com uma letra maiúscula são listados antes daqueles que começam com uma letra minúscula.
Chnossos
11
+1 por se aproximar mais do que a resposta aceita, mas para resumir as limitações: a classificação tornará maiúsculas de minúsculas e caracteres estrangeiros - embora agora impressos corretamente devido a UTF-8- não serão classificados corretamente.
usar o seguinte comando
3
C.UTF-8é um código de idioma inválido, portanto, o código de idioma é revertido para C. Você ainda perde o suporte a UTF-8. De fato, é ainda pior, já que a LC_ALL=Cmaioria dos programas exibe a maioria dos caracteres multibyte corretamente , mas com LC_ALL=something_invalidalguns programas não (como `ls).
Martin Tournoij 7/06
@MartinTournoij, mas se Stéphane Chazelas disser o contrário sobre sistemas GNU (então presumivelmente Debian e Linux em geral), qual é o correto?
muru 9/07/19
@muru Não tenho certeza, acho que você terá que perguntar a Stéphane? Tudo o que sei é que localeparece haver erro com LC_ALL=C.UTF-8: gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 - que está no Arch Linux.
Martin Tournoij
3

A página de manual ls (1) lista:

-v tipo natural de (versão) números no texto

Isso parece mudar a forma como os períodos são classificados e agrupa primeiro os arquivos de ponto. Eu tenho:

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

no meu ~ / .bashrc.

Vince Valenti
fonte
1

Uma ideia fora da parede

Disclaimer: Isso vai ser um exagero para a maioria de vocês. Mas faço isso desde 1995 e tenho as habilidades necessárias para tornar meu mundo exatamente como eu quero. Então eu porque não?

Eu realmente gosto de usar diferentes métodos de classificação com ls, especialmente -rt(que é classificado por ime rmodificado inverso t). Então, decidi tentar algo louco 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, /^(\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]
}

Agora, em vez de definir um alias do bash, eu defino uma função bash (porque os aliases só podem anexar 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 exemplo:

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 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 https://github.com/RichardBronosky/dotfiles/commit/6170c0a9

O mais importante é que é uma estrutura para ajustar sua lssaída. Você pode fazer o que quiser com esse filtro awk. Você pode querer que sejam diretórios, arquivos de ponto e todo o resto. Depois de saber como lidar com suas cores xterm, não é muito difícil. Depende totalmente de você.

Bruno Bronosky
fonte
-1

Pode tentar isso 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 recente do ls que use "--group-directory-first" como uma opção. Obviamente, você pode ajustar as opções de LS ao seu gosto.

Phil
fonte
O que --group-directories-firsttem a ver com "show dotfiles first"?
G-Man diz 'Reinstate Monica'