Classificar arquivos de diretório por número

0

Eu tenho este diretório

$ ls
0    2    4    config.yml
1    3    catalog.svg

Os subdiretórios são numerados a partir de 0. Preciso obter o número máximo.

Ao tentar ls | sort -n , obtenho

0
catalogIcon-gitlab.svg
config.yml
1
2
3
4

O que está acontecendo aqui? Por que é c entre 0 e 1?

Como escrevo meu comando para obter o número mais alto?

Sistema: bash, MacOS

    
por WeSee 26.09.2018 / 20:32

4 respostas

4

Tente isto para obter o diretório com o número máximo:

max=$(printf "%s\n" */ | sort -n | tail -1)
echo "${max%/}"
    
por 26.09.2018 / 21:20
2

sort -n classifica "de acordo com o valor numérico da string"; nessa situação, quando sort tentar comparar numericamente um número com uma letra, ele retornará para memcmp dos bytes correspondentes, colocando c (ASCII 99) após 0 (ASCII 48). Com a opção --debug do tipo GNU, você pode ver a falha acontecendo:

$ ls |sort -n --debug
sort: using ‘en_US.UTF-8’ sorting rules
0
_
_
catalogIcon-gitlab.svg
^ no match for key
______________________
zoo
^ no match for key
___
1
# ... continues ...

Para uma solução somente bash, eu usaria um loop (assumindo, como você indica, que os diretórios começam em 0 ):

highest=-1
for d in *; do [[ -d "$d" ]] || continue; [[ "$d" -gt "$highest" ]] && highest=$d; done
printf '%s\n' "$highest"
    
por 26.09.2018 / 21:23
0

ls já classificará lexicalmente por padrão. Você está apenas lendo-os na ordem errada quando apresentados de forma resumida assim. Leia abaixo cada coluna e depois para o próximo. Para ver a ordem lexical real que o ls está usando, envie um objeto por linha:

$ ls -1
0
1
2
3
4
catalog.svg
config.yml
    
por 26.09.2018 / 20:42
0

Que tal?:

ls -1v
0
1
2
3
4
12
23
catalog.svg
config.yml

v significa version ordem de classificação.

Para obter o último (maior) número, selecione apenas números:

$ ls -1v | grep -x '[0-9]*'
0
1
2
3
4
12
23

E assine:

$ ls -1v | grep -x '[0-9]*' | tail -n 1
23

Uma única solução bash:

$ max=0; for d in */; do d=${d%/}; [[ d -gt max ]] && max=$d; done; printf '%d\n' "$max"
23
    
por 27.09.2018 / 03:52

Tags