Tente isto para obter o diretório com o número máximo:
max=$(printf "%s\n" */ | sort -n | tail -1)
echo "${max%/}"
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
Tente isto para obter o diretório com o número máximo:
max=$(printf "%s\n" */ | sort -n | tail -1)
echo "${max%/}"
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"
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
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