Eu tenho um monte de arquivos de log1
para log164
.
Estou tentando listar o diretório (classificado) em um terminal UNIX, mas as funções de classificação estão apenas fornecendo o formato como este:
home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc
O que eu quero é
home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc
Alguma sugestão sobre o que eu poderia usar para fazer isso?
log1.gz
atravéslog164.gz
, então o que você precisa mesmo dels -1
-los para?ls -1
faz: lista nomes de arquivos. Como você já conhecia os nomes dos arquivos, não entendi para o que você precisava. Mas desde que você aceitou a resposta de Kevin, agora eu sei: você não precisava dela. O que faz mais sentido. :-)Respostas:
bash
's chaves,,{}
irá enumerá-los em ordem:fonte
Por que não usar o
ls
recurso interno para esse caso em particular,-v natural sort of (version) numbers within text
Por exemplo
ls -1v log*
fonte
sort
, no caso de um tem uma matriz de strings em vez de um diretório de arquivos-v - Force unedited printing of non-graphic characters
.ls | sort -n
Com o GNU ls (ou seja, no Linux, Cygwin ou outros sistemas que possuem o GNU ls especificamente instalado):
No zsh:
Em outras conchas:
Substitua
echo
porprintf '%s\n'
se desejar que cada nome de arquivo esteja em uma linha separada.Se você também deseja metadados de arquivo (
ls -l
) e não possui GNU ls, precisará chamarls
separadamente cada nome de arquivo ou grupo de nomes de arquivo que deseja ver em ordem lexicográfica.Para evitar essas dificuldades, use zeros à esquerda suficientes em seus nomes de arquivo para que a classificação lexicográfica seja amigável para humanos (
log001.gz
, etc).fonte
Embora a solução
ls -1v
seja certamente a melhor neste caso em particular, acho bom ter também uma que funcionesort
como na pergunta original, pois isso funciona também quando a sua entrada não vemls
. Nesse caso, você pode usar:A
-n
opção informa a classificação para classificar numericamente e-k 1.4
define a chave de classificação para o primeiro campo (que é o nome do arquivo inteiro nesse caso), começando do 4º caractere até o último.fonte
ls -1 | sort -n -k1.4
não funciona. Dá os não ordenados no início até 4 caracteres, depois os ordenados após o 4º caractere. Eu usei emls -1 |sort | sort -n -k1.4
vez disso e funcionou perfeitamente.sort -k1.1,1.3 -k1.4n
.sort
as implementações não precisam ser estáveis, portanto sua abordagem não funcionará com todas as implementações. Veja também a-V
opção do GNU e FreeBSDsort
.O GNU
sort
(como disponível no Linux) possui um modo de "classificação da versão" que interpreta números dentro de não-números da maneira que você solicita:De
man 1 sort
:(Criando arquivos de teste vazios para listar
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102.gz
:)Seu exemplo de caso, adicionando a
-V
opção (ou--version-sort
):fonte
se você usa Mac ou BSD, tente o seguinte:
fonte
Minha versão do Solaris não suporta
ls -v
(grrr). E a solução de classificação fornecida acima 1) requer conhecimento da posição dos dígitos no nome do arquivo e 2) não trata de coisas como números de versão com várias partes.A abordagem abaixo é compatível com Solaris, não requer conhecimento prévio das posições dos dígitos e lida com os números de versão com 2, 3 ou 4 componentes (como: a-1.2, foo-5.6.7, bar_baz_9.10.11.12). Ele também usa
sort -f
para dobrar maiúsculas e minúsculas e manipula adequadamente diretórios misturados com arquivos:ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n
Observe que esta versão limita o primeiro componente a um único dígito.
Se o seu sistema operacional de destino é compatível
ls -v
, essa é claramente a solução superior.fonte
Solução Perl:
fonte
fonte
-t .
é supérfluo aqui.Isso funcionou para mim.
Eu tenho arquivos 1.jpg 2.jpg ... 18.jpg
$ echo *.jpg | tr -s ' ' '\n' | sort -n
sort
está ficando confuso com als
saída devido a caracteres coloridos não imprimíveis. Se você tentar isso:ls -1 --color=none *.jpg | sort -n
funcionará perfeitamente.
sort
pode ignorar caracteres não imprimíveis com a-i
opção, mas ainda não funciona e não sei por quê.Mas você sempre pode tirar a cor dessa maneira e
sort
funcionará:ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n
Espero que um dia
sort
tenha uma opção para isso.fonte