vérifier le plus grand nombre d'un dossier spécifique

Dans l'un de mes dossiers j'ai beaucoup de files ressemble à 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 

Je voudrais find le plus grand nombre d' enum- et l'exporter vers une variable, disons ENUM_LARGEST , qui sera utilisée dans un futur script. Comment devrais-je écrire cette ligne?

Voici quelque chose pour vous aider à démarrer:

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

… qui obtiendra la valeur zéro-padded. Une façon de dépouiller les zéros de tête:

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

Avec zsh:

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

Le <-> glob correspond à n'importe quelle séquence de numbers. Le qualificateur glob [-1] restreint la list des correspondances au dernier. Le qualificatif glob n fait que le sorting prend en count les valeurs numériques au lieu de l'ordre lexicographique; cela ne fait aucune différence ici, mais ce serait nécessaire si vos numéros n'étaient pas remplis de zéros à la même largeur.

Avec n'importe quel shell de style Bourne / POSIX, en s'appuyant sur le fait que les nombres sont remplis de zéro: faites correspondre tous les files et conservez le dernier.

 set_last_match () { eval "$1=\${$#}" } set_last_match ENUM_LARGEST enum-[0-9]* 

Une réponse pure et simple:

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

Et un autre :

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

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

affiche tous les files commençant par «enum-», puis un nombre et ne vous montre que les 6 derniers caractères (la longueur de vos strings de numbers plus un pour le return chariot). S'appuie sur votre coquille en sortingant les nombres correctement (aussi longtime que tout est rembourré de la même façon, il devrait).

Vous ne devriez pas parsingr ls . Utilisez plutôt echo / awk :

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

La partie awk printf est le numéro du numéro de file le plus élevé avec des zéros à 00190 ( 00190 ). substr coupe les 6 premiers caractères ( enum- ).

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

Cela stocke la string entière, par exemple enum-00190 . Si vous voulez juste le numéro, vous pouvez append la cut -c 6- à la fin de ce pipeline. Notez que cela ne fonctionne que si le préfixe est littéralement enum- ; si vous voulez travailler avec des arbitraires, il faut un peu plus de comptabilité.