Risposte:
Non molto raffinato ma sembra funzionale:
var = $ (ls | sort -V | tail -n 1)
Quindi hai l'ultimo file memorizzato in $var
Ecco una soluzione che utilizza il globbing (quindi non fa affidamento su parsing ls ), come la prima soluzione di terdon, ma non ha bisogno di scorrere tutti i file:
myfiles=(myfile_v*)
lastfile="${myfiles[${#myfiles[@]}-1]}"
unset myfiles
Innanzitutto, tutti i file corrispondenti vengono letti in un array. Quindi, viene assegnato l'ultimo elemento dell'array $lastfile
. Infine, l'array non è più necessario, quindi può essere eliminato.
Sfortunatamente, bash
(almeno per quanto ne so) non supporta l'ordinamento del risultato dal globbing # , quindi questo esempio funziona bene con lo schema di denominazione fornito (esattamente due cifre, anche per le versioni & lt; 10), ma fallirà per myfile_v1.txt
, myfile_v2.txt
, ..., myfile_v10.txt
.
# zsh
(ovviamente ;)
) fa, così zsh% myfiles=(myfile_v*(n)); lastfile="${myfiles[-1]}"; unset myfiles
non soffrirebbe di questa limitazione
Esistono due approcci ovvi: puoi analizzare il nome del file o cercare il file più recente:
Analizza il nome del file, questo presuppone che tutti i file siano nominati come nel tuo esempio:
$ latest=myfile_v$(
for f in myfile_v*; do
ver=${f##myfile_v}; ver=${ver%.txt}; echo $ver;
done | sort -n | tail -n 1).txt
Ottieni il file più recente (assumendo nomi di file relativamente sani che non contengano newline)
$ latest=$(ls -tr | tail -n 1)
-t
) in ordine inverso ( -r
) quindi l'ultimo file è il più recente