'Ls' do Unix classificar por nome

127

Você pode classificar uma lista ls por nome?

Devang Kamdar
fonte
10
Se não estiver classificando por nome sem argumentos, convém verificar se ls foi aliasado para outra coisa ou simplesmente invocá-lo usando o caminho completo que eliminaria quaisquer aliases existentes.
Tvanfosson 18/05/2009
O gnu-coreutils ls classifica por padrão. Qual é o sistema que você está usando (como outros têm perguntado)
Nick Fortescue
Tem certeza de que está pedindo para classificar por nome e não por tipo (ou seja, diretório primeiro e depois arquivos)?
Curtisk 18/05/09
Letras maiúsculas vêm antes de letras minúsculas, assim o arquivo Z vem antes do arquivo a ... como posso corrigir isso?
ArtOfWarfare
A página de manual diz 'classificada separadamente e em ordem lexicográfica'. Os arquivos serão classificados de acordo com o primeiro caractere: numéricos [0..9] e caracteres superior [a..z] e Lowe caracteres [a..z]
Gürol Canbek

Respostas:

131

Meu ls classifica por nome por padrão. O que você está vendo?

man ls afirma:

List information about the FILEs (the current directory by default). Sort entries alpha‐betically if none of -cftuvSUX nor --sort is specified.:

Evert
fonte
lsnão classifica se -c1especificado: existe uma maneira de fazê-lo? ( --sort=nameparece não funcionar)
dhc
1
Isso não é verdade. com ls -la, vejo .bashrc - can - .config - Downloads - .local - tmp.bashrc - .config - .local - Downloads - can - tmp
:,
1
o meu diz que o 100.jpg vem antes do 10.jpg. Faz sentido, acho que se "0" vem antes de "." mas ainda não é intuitivo
chiliNUT
Estou vendo "M" antes de "b". Confuso. Espere, a capitalização é importante?
Daniel Springer
105

Para algo simples, você pode combinar ls com classificação . Para apenas uma lista de nomes de arquivos:
ls -1 | ordenar

Para classificá-los na ordem inversa:
ls -1 | classificar -r

Marca
fonte
3
Existe uma maneira de classificar arquivos como este: ls | sort -n 1.1.1; 1.1.2; 1.1.3; 2.10.1; 2.10.15; 2.10.2; 2.10.20; 2.10.21; 2.1.1; 2.1.10; 2.1.15; 2.1.2; 2.1.3; 2.1.4; 10.1.1; 10.1.2; 10.1.3; 11.0.1; 11.0.2; 11.0.20; 11.0.21; 11.0.22; Como você pode ver 2.10.15 antes de 2.10.2 .
BBK 14/02
Estou desenvolvendo o Android em um dispositivo Pidion e o ls não se classifica automaticamente, então isso foi muito útil! O único problema é que parece que ele classifica soft links, mas não classificar os arquivos, por algum motivo
Mitch
No Mac, parece que o segundo comando pode ser reduzido para ls -1r.
Ash Ryan Arnwine
4
@BBK sort -V ordenará por números de versão, para que você obtenha .. 2.10.2; 2.10.15; .. from man sort .. --sort = WORD classificará de acordo com WORD: numérico geral -g, numérico humano -h, mês -M, numérico -n, aleatório -R, versão -V
mosh
35

lsfrom coreutilsrealiza uma classificação com reconhecimento de localidade por padrão e, portanto, pode produzir resultados surpreendentes em alguns casos (por exemplo, %fooclassificará entre bare quuxdentro LANG=en_US). Se você deseja uma classificação ASCIIbetics, use

LANG=C ls
Richard Smith
fonte
LANGilfnuence o comportamento de classificação, este post me ajuda muito!
precisa saber é o seguinte
Isso funcionou para mim também. você poderia elaborar isso? Por que é diferente?
Kostas28
1
Essa dose funciona, mas gera saída ?para todos os caracteres não-ascii quando a saída é um terminal (o recurso ruim de ls verifica se a saída é para um terminal, funciona ao canalizar). Você pode "consertar" isso com o canal para cat, usar o C.UTF-8código do idioma (se o seu sistema suportar) e / ou usar o -bsinalizador. Ainda melhor, não use lsem tudo, melhor aproveitamento `
12431234123412341234123
Isso me ajudou a descobrir que, para mim, o problema era que alguns dos meus nomes de arquivos continham um hífen (-) e outros, um traço (-). lsclassifica hífens antes de traços.
Jamy Mahabier
17

A beleza das ferramentas * nix é que você pode combiná-las:

ls -l | sort -k9,9

A saída de ls -lserá assim

-rw-rw-r-- 1 luckydonald luckydonald  532 Feb 21  2017 Makefile
-rwxrwxrwx 1 luckydonald luckydonald 4096 Nov 17 23:47 file.txt

Então, com 9,9você classificar coluna 9até a coluna 9, sendo os nomes dos arquivos. Você deve fornecer onde parar, que é a mesma coluna neste caso. As colunas começam com 1.

Além disso, se você deseja ignorar letras maiúsculas / minúsculas, adicione --ignore-caseao comando de classificação.

user491575
fonte
1
O que -k9,9significa isso ?
luckydonald
Descoberto, significa classificar a coluna 9para a mesma coluna 9. Uma lssaída normal se parece com drwx------ 8 999 user 4.0K Feb 5 2017 file.txtisso:, portanto, a coluna 9 é o nome dos arquivos. Se você deseja ignorar o caso, use --ignore-casena classificação.
luckydonald
8

AVISO: "a" aparece APÓS "Z":

$ touch A.txt aa.txt Z.txt

$ ls

A.txt Z.txt aa.txt

russian_spy
fonte
3
Isto não é sempre verdade. Não sei exatamente as circunstâncias que fazem isso não ser verdade, mas na minha máquina executando o Ubuntu 12.04 a saída de ls é classificada em ordem alfabética (ignorando o caso).
Patrick James McDougle
Boa pegada! Parece que é requisitá-lo com base no código ASCII .. alfabetos maiúsculas são seguidos por letras minúsculas ..
Kent Pawar
1
Percebi que meu MacOS classifica os primeiros números, depois as maiúsculas, as sublinhadas e as minúsculas. É engraçado que eles não diferenciam maiúsculas de minúsculas. Por outro lado, meu Debian faz distinção entre maiúsculas e minúsculas, mas classifica as letras sem sensibilidade, a menos que haja um empate e, em seguida, vitórias em minúsculas! Exemplo: ABA.txt ABb.txt aBC.txt AbC.txt ABc.txt
zk82 15/16/16
Eu também estou no MAC. Fiquei decepcionado ao ver o tipo de classificação A, Z, a, z. Estou aqui porque prefiro ter A, a, Z, a. obrigado pela sua dica. experimentará as normalsoluções aqui.
Neyxee
8

Os arquivos que diferem apenas por uma sequência numérica podem ser classificados nesse número na condição de ser precedido por um separador.

Nesse caso, a seguinte sintaxe pode ser usada:

ls -x1 file | sort -t'<char>' -n -k2

Exemplo:

ls -1 TRA*log | sort -t'_' -n -k2

TRACE_1.log
TRACE_2.log
TRACE_3.log
TRACE_4.log
TRACE_5.log
TRACE_6.log
TRACE_7.log
TRACE_8.log
TRACE_9.log
TRACE_10.log
poney
fonte
4

Na página do manual (para bash ls):

Classifique as entradas em ordem alfabética se nenhuma das opções -cftuSUX e --sort.

jwoolard
fonte
3
Não há "bash ls". Faça "what ls"
Norbert Hartl
@ Norbert: Você está correto, mas which lsteria sucesso mesmo se o bash tivesse um ls embutido. Em vez disso, faça builtin lsno bash e obtenha um erro.
Pianosaurus
4
@ Norbert: whichsempre retorna um caminho. Use type lspara determinar o que o shell pensa que lsé (interno, função, executável).
Ephemient 18/05/09
3

O lsutilitário deve estar em conformidade com IEEE Std 1003.1-2001 ( POSIX.1), que afirma:

22027: deve classificar operandos de diretório e não diretório separadamente de acordo com a sequência de intercalação no código de idioma atual.

26027: Por padrão, o formato não é especificado, mas a saída deve ser classificada em ordem alfabética pelo nome do símbolo:

  • Nome da biblioteca ou do objeto, se −A for especificado
  • Nome do símbolo
  • Tipo de símbolo
  • Valor do símbolo
  • O tamanho associado ao símbolo, se aplicável
kenorb
fonte
2

Verifique se .bashrchá aliases no seu arquivo.

Sujit
fonte
7
Pode-se apenas digitar aliaspara verificar todos os aliases atuais.
Krzysztof Jabłoński
2

ls -X funciona para esse fim, caso você tenha alsado ls a um padrão mais útil.

jezzo
fonte
0
In Debian Jessie, this works nice:

ls -lah --group-directories-first

# l=use a long listing format
# a=do not ignore entries starting with .
# h=human readable
# --group-directories-first=(obvious)
# Note: add -r for reverse alpha

# You might consider using lh by appending to ~/.bashrc as the alias:
~$ echo "alias lh='ls -lah --group-directories-first'" >>~/.bashrc
# -- restart your terminal before using lh command --
James T
fonte