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)
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?
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)
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]*
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
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).
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-
).
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.