verificando o maior número de uma pasta específica

3

Dentro de uma das minhas pastas eu tenho muitos arquivos parecidos com enum-*

$ ls
PRIM         enum-00020   enum-00040   enum-00059   enum-00078   enum-00101   enum-00122   enum-00141   enum-00160   enum-00179
enum-00001   enum-00021   enum-00041   enum-00060   enum-00079   enum-00102   enum-00123   enum-00142   enum-00161   enum-00180
enum-00002   enum-00022   enum-00042   enum-00061   enum-00080   enum-00103   enum-00124   enum-00143   enum-00162   enum-00181
enum-00003   enum-00023   enum-00043   enum-00062   enum-00081   enum-00104   enum-00125   enum-00144   enum-00163   enum-00182
enum-00005   enum-00024   enum-00044   enum-00063   enum-00082   enum-00106   enum-00126   enum-00145   enum-00164   enum-00183
enum-00006   enum-00026   enum-00045   enum-00064   enum-00084   enum-00107   enum-00127   enum-00146   enum-00165   enum-00184
enum-00007   enum-00027   enum-00046   enum-00065   enum-00085   enum-00108   enum-00128   enum-00147   enum-00166   enum-00185
enum-00008   enum-00028   enum-00047   enum-00066   enum-00086   enum-00110   enum-00129   enum-00148   enum-00167   enum-00186
enum-00009   enum-00029   enum-00048   enum-00067   enum-00087   enum-00111   enum-00130   enum-00149   enum-00168   enum-00187
enum-00010   enum-00030   enum-00049   enum-00068   enum-00088   enum-00112   enum-00131   enum-00150   enum-00169   enum-00188
enum-00011   enum-00031   enum-00050   enum-00069   enum-00089   enum-00113   enum-00132   enum-00151   enum-00170   enum-00189
enum-00012   enum-00032   enum-00051   enum-00070   enum-00090   enum-00114   enum-00133   enum-00152   enum-00171   enum-00190
enum-00013   enum-00033   enum-00052   enum-00071   enum-00092   enum-00115   enum-00134   enum-00153   enum-00172   enum-layered
enum-00014   enum-00034   enum-00053   enum-00072   enum-00094   enum-00116   enum-00135   enum-00154   enum-00173
enum-00015   enum-00035   enum-00054   enum-00073   enum-00095   enum-00117   enum-00136   enum-00155   enum-00174
enum-00016   enum-00036   enum-00055   enum-00074   enum-00096   enum-00118   enum-00137   enum-00156   enum-00175
enum-00017   enum-00037   enum-00056   enum-00075   enum-00098   enum-00119   enum-00138   enum-00157   enum-00176
enum-00018   enum-00038   enum-00057   enum-00076   enum-00099   enum-00120   enum-00139   enum-00158   enum-00177
enum-00019   enum-00039   enum-00058   enum-00077   enum-00100   enum-00121   enum-00140   enum-00159   enum-00178

Eu gostaria de encontrar o maior número de enum- e exportá-lo para uma variável, digamos ENUM_LARGEST , que será usado em um script futuro. Como devo escrever esta linha?

    
por user40780 08.09.2015 / 19:47

6 respostas

3

Aqui está algo para você começar:

ENUM_LARGEST=$(ls | sed 's/enum-//' | sort -n | tail -1)

... que receberá o valor zero-preenchido. Uma maneira de remover os zeros à esquerda:

ENUM_LARGEST=$(ls | sed 's/enum-//' | sort -n | tail -1 | bc)
    
por 08.09.2015 / 20:07
5

Com zsh:

ENUM_LARGEST=(enum-<->(n[-1]))

O <-> glob corresponde a qualquer sequência de dígitos. O qualificador da glob [-1] restringe a lista de correspondências à última. O qualificador de glob n faz com que a classificação leve em consideração valores numéricos em vez de ordem lexicográfica; não faz qualquer diferença aqui, mas seria necessário se os números não fossem preenchidos com zeros na mesma largura.

Com qualquer shell do tipo Bourne / POSIX, confiando no fato de que os números são preenchidos com zero: correspondem a todos os arquivos e mantém o último.

set_last_match () {
  eval "$1=\${$#}"
}
set_last_match ENUM_LARGEST enum-[0-9]*
    
por 09.09.2015 / 02:56
4

Uma resposta pura:

(/home/****/test)
└-(>:) ls
toto001  toto002  toto003  toto004  toto005  toto067
(/home/****/test)
└-(>:) file=( toto* ) ; echo ${file[-1 ]#toto}
067

E outro:

(/home/****/test)
└-(>:) for last in toto*; do :; done; printf '%s\n' "${last#toto}" 
067
    
por 08.09.2015 / 22:38
2

echo enum-[0-9]* | tail -c 6

imprime todos os arquivos que começam com "enum-" e, em seguida, um número e mostra apenas os últimos 6 caracteres (o comprimento de suas seqüências numéricas mais um para o retorno de carro). Depende do seu shell ordenar os números corretamente (contanto que tudo esteja preenchido da mesma forma, deveria).

    
por 08.09.2015 / 19:54
2

Você não deve analisam ls . Em vez disso, use echo / awk :

ENUM_LARGEST="$(echo enum-* | awk '$0=substr($NF,6)')"

A parte awk imprime o número do número de arquivo mais alto com zeros à esquerda ( 00190 ). substr corta os primeiros 6 caracteres ( enum- ).

    
por 08.09.2015 / 20:11
1

ENUM_LARGEST=$(ls enum-* | sort | tail -n1)

Isso armazena a string inteira, por exemplo %código%. Se você quiser apenas o número, adicione enum-00190 ao final desse pipeline. Observe que isso só funciona se o prefixo for literalmente cut -c 6- ; se você quer trabalhar com outros arbitrários, precisa de um pouco mais de contabilidade.

    
por 08.09.2015 / 19:53