Não é muito refinado, mas parece funcional:
var=$(ls | sort -V | tail -n 1)
Então você tem o último arquivo armazenado em $var
Em um diretório, eu tenho os seguintes arquivos:
myfile_v01.txt
myfile_v02.txt
myfile_v03.txt
Como criar um script bash que detecta o valor da última versão e coloca o nome desta última versão em uma variável?
Aqui está uma solução que usa globbing (portanto, não depende de análise de ls ), como a primeira solução de terdon, mas não Não é necessário iterar todos os arquivos:
myfiles=(myfile_v*)
lastfile="${myfiles[${#myfiles[@]}-1]}"
unset myfiles
Primeiro, todos os arquivos correspondentes são lidos em uma matriz. Em seguida, o último elemento da matriz é atribuído a $lastfile
. Por fim, a matriz não é mais necessária, por isso pode ser excluída.
Infelizmente, bash
(pelo menos que eu saiba) não suporta classificar o resultado de globbing # , então este exemplo funciona bem com o esquema de nomenclatura (exatamente dois dígitos, também para versões < 10), mas falhará em myfile_v1.txt
, myfile_v2.txt
, ..., myfile_v10.txt
.
# zsh
(é claro que ;)
) faz, então zsh% myfiles=(myfile_v*(n)); lastfile="${myfiles[-1]}"; unset myfiles
não sofreria com essa limitação.
Existem duas abordagens óbvias: você pode analisar o nome do arquivo ou procurar o arquivo mais recente:
Analise o nome do arquivo, isto assume que todos os arquivos são nomeados como em seu exemplo:
$ 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
Obtenha o arquivo mais recente (assumindo nomes de arquivos relativamente sadios que não contenham novas linhas)
$ latest=$(ls -tr | tail -n 1)