Como obter a pasta que possui o maior número

3

Digamos que você tenha um diretório pai que contenha 4 subdiretórios. Cada subdiretório contém conteúdo idêntico. Além disso, cada nome de subdiretório é um número inteiro, quanto maior o número inteiro, mais recente será o diretório e seu conteúdo

Exemplo:

parentdir/
-> 1/
-> 2/
-> 6/
-> 3/

Como faço para obter o maior subdiretório, conforme especificado em um caminho, como:

/user/mosawi/parentdir/${NEWEST}/payload.gzip

isso avaliaria: /user/mosawi/parentdir/6/payload.gzip

    
por mosawi 07.05.2017 / 11:12

4 respostas

2

Se os números tiverem o mesmo número de dígitos, a ordem normal de classificação deverá ser preenchida, então poderíamos apenas preencher uma matriz com os nomes e pegar o último elemento

$ mkdir -p parentdir/{1,2,6,3}
$ A=(parentdir/*)              # fill an array with the names
$ echo "${A[-1]}"              # print the last member of the array
parentdir/6
$ echo "${A[-1]##*/}"          # remove everything up to last / 
6

Mas se eles tiverem números diferentes de dígitos, isso não funcionará (o pedido seria 1 , 13 , 2 , ...). Então, vamos encontrar o máximo manualmente:

$ mkdir -p parentdir/{1,2,6,3,13}
$ max=0;                       # assuming they're non-negative integers!
$ for x in parentdir/* ; do 
    n=${x##*/};                # take just the number so that comparisons work 
    [ "$n" -gt "$max" ] && max=$n 
  done
$ echo "$max" 
13

O anterior é muito mais fácil que vale a pena considerar criar os nomes preenchidos com um comprimento fixo com zeros à esquerda, se possível.

    
por 07.05.2017 / 11:27
4

Você precisa do mais novo diretório, certo? Então pare de brincar com números e deixe zsh fazer o trabalho:

NEWEST=(/user/mosawi/parentdir/*(/om[1]))
NEWESR=${NEWEST}/payload.gzip

O truque é usar qualificadores glob para classificar os diretórios ( o ) ( / ) no tempo de modificação ( m ) e obter apenas o primeiro um ( [1] ).

    
por 07.05.2017 / 14:58
1

Supondo que os nomes dos diretórios sejam classificados corretamente (ou seja, eles contêm o mesmo número de dígitos e não há nomes não numéricos no diretório):

newest="$(printf '%s\n' /user/mosawi/parentdir/* | tail -n 1)"

O arquivo será "$newest/payload.gzip" .

Outro truque é criar um link simbólico para o diretório mais recente sempre que um novo diretório for criado:

mkdir "parentdir/$i" && ln -sf "parentdir/$i" parentdir/latest

É então fácil acessar parentdir/latest/payload.gzip .

    
por 07.05.2017 / 11:23
1

mkdir -p parentdir/{1,2,6,3,13}

apenas ls , sem classificação:

ls parentdir/
1  13  2  3  6

agora classifique:

ls parentdir/ -v
1  2  3  6  13

Agora, classificando e pegue o último:

ls parentdir/ -v | tail -n1
13

Prós: sem loops, uma linha

Contra: invocar comando externo

    
por 07.05.2017 / 16:43