Obtém o último nome de arquivo em uma variável no bash?

3

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?

    
por Vincent 12.12.2013 / 17:51

3 respostas

10

Não é muito refinado, mas parece funcional:

var=$(ls | sort -V | tail -n 1)

Então você tem o último arquivo armazenado em $var

    
por 12.12.2013 / 18:06
4

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.

    
por 13.12.2013 / 21:38
4

Existem duas abordagens óbvias: você pode analisar o nome do arquivo ou procurar o arquivo mais recente:

  1. 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
    
  2. Obtenha o arquivo mais recente (assumindo nomes de arquivos relativamente sadios que não contenham novas linhas)

    $ latest=$(ls -tr | tail -n 1)
    
por 12.12.2013 / 18:09

Tags