Crie os seguintes arquivos em um diretório
$ touch .a .b a b A B 你好嗎
Meu ls
pedido padrão ignora a presença de pontos iniciais, misturando-os com os outros arquivos.
$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Eu posso mudar LC_COLLATE
para colocar os arquivos de ponto em primeiro lugar.
$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Infelizmente isso faz com que a ordem de classificação entre maiúsculas e minúsculas, ou seja, A
e B
precedem a
e b
. Existe uma maneira de imprimir arquivos de ponto primeiro, mantendo a distinção entre maiúsculas A
e minúsculas ( e a
precedendo B
e b
)?
Editar: tentando modificar LC_COLLATE
Até agora, nenhuma das respostas replica totalmente a funcionalidade ls
facilmente. É concebível que eu poderia agrupar alguns deles em uma função, mas isso teria que incluir algum código detalhado sobre (por exemplo) como trabalhar sem argumento versus fornecer um diretório como argumento. Ou como lidar com uma -d
bandeira explícita .
Como alternativa, pensei que talvez pudesse ser melhor LC_COLLATE
usar. No entanto, não consigo fazer isso funcionar. Atualmente estou usando LC_COLLATE="en_AU.UTF-8"
. Eu verifiquei /usr/share/i18n/locales/en_AU
(embora não tenha certeza se esse é o arquivo certo, pois não consigo ver nenhuma referência UTF-8
); Encontrei o seguinte.
LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE
/usr/share/i18n/locales/iso14651_t1
contém copy "iso14651_t1_common"
. Finalmente, /usr/share/i18n/locales/iso14651_t1_common
contém
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
Excluí esta linha, executei sudo locale-gen
e reiniciei o meu computador. Infelizmente, isso não mudou nada.
$@
.Você pode usar ordem de classificação do shell em vez (que pode não envolver a ordem de intercalação do local;
bash
, AT & Tksh
,yash
,tcsh
ezsh
dar os resultados esperados,mksh
edash
. Nãofish
parece dar uma ordem insensível caso, mas dá resultados diferentes quando há não-ASCII personagens):Isso fornece
ls
uma lista explícita de arquivos (e diretórios) a serem listados e desativals
a classificação (-U
que é uma extensão GNU).Existem algumas ressalvas, dependendo do shell que você está usando.
zsh
, anomatch
opção padrão fará com que o comando falhe se o diretório não contiver arquivos ocultos e não ocultos; você pode desativarnomatch
para evitar isso, mas o melhor seria fazer issoset -o cshnullglob
(e o comando falhará apenas se nenhum dos globs corresponder como nos(t)csh
shells do Unix anteriores).zsh
,pdksh
e sua expansão derivada efish
,.*
não inclui.
e..
, portanto, isso correspondels -Al
. Com outras conchas.
e..
estão incluídos para combinarls -al
. No último caso, você precisará alterar os padrões de globbing para excluir.
e..
(ls -dUl -- ..?* .[!.]* *
).fish
,(t)csh
ouzsh
, se algum dos padrões de globbing não corresponder a nada,ls
produzirá uma mensagem de erro; você pode evitar isso, quer definindo anullglob
opção (embash
ouzsh
pelo menos), ou através do redirecionamentostderr
para/dev/null
(ls -dUl -- ..?* .[!.]* * 2>/dev/null
). Se você usarnullglob
, cuidado com o comportamento potencialmente surpreendente que causa (consulte Shell comendo caracteres `?` ).fish
se comporta comobash
comnomatch
exceção de que, quando interativo, uma mensagem de aviso será emitida para cada glob que não corresponder.(Com agradecimentos a Stéphane Chazelas por todo o feedback!)
fonte
mksh
e,dash
por exemplo, não classificará maiúsculas de minúsculas.-U
(para significar não classificado) é uma extensão GNU. Algumas outrasls
implementações, como o FreeBSD, têm uma lista,-U
mas não para uma lista não classificada.ls
, você precisa--
antes.*
de que a implementação aceita opções depois de argumentos (a menos que POSIXLY_CORRECT está no ambiente)ls
como argumento.[!.]
está correto. Veja pubs.opengroup.org/onlinepubs/9699919799/utilities/… . Alguns shells (a maioria?) Permitem^
como sinônimo de!
globs de classe de caracteres negados. Em qualquer caso, eu prefiro.[!.] .??* *
como sendo um pouco mais compreensível do que.[!.]* ..?* *
Você pode simplesmente usar dois
ls
comandos separados :Diferentemente das outras respostas até agora, essa abordagem exibe os arquivos de pontos primeiro evitando as entradas
.
e..
, depois as demais entradas emls
ordem alfabética.As respostas do @StephenKitt podem ser melhoradas para alcançar o mesmo resultado:
fonte
ls
como argumento. (FWIW Eu estou usando zsh, mas isso é útil para bash-pessoas, eu acho.)Você pode jogar com as opções de comando ls . Tente o seguinte:
Onde:
fonte
-X
bandeira é classificada pela extensão após a.
, que é totalmente diferente. Além disso, os arquivos estão em ordem alfabética inversa. Além disso, embora os arquivos de ponto sejam os primeiros no meu exemplo, ele não funcionará em todos os casos (por exemploa.b
c.d
.a
.c
). Além disso, você usou em-a
vez de-A
.