Ottieni l'ultimo nome di file in una variabile in bash?


3

In una directory, ho i seguenti file:

myfile_v01.txt
myfile_v02.txt
myfile_v03.txt

Come creare uno script bash che rileva il valore dell'ultima versione e inserisce il nome file di quest'ultima versione in una variabile?

Risposte:


10

Non molto raffinato ma sembra funzionale:

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

Quindi hai l'ultimo file memorizzato in $var


2
fyi: Perché non dovresti analizzare l'output di ls (1): mywiki.wooledge.org/ParsingLs
MarZab

@ MarZab Sì, hai ragione. Ho già visto questo articolo e ha alcuni punti validi.
Erathiel

4

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


4

Esistono due approcci ovvi: puoi analizzare il nome del file o cercare il file più recente:

  1. 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
    
  2. Ottieni il file più recente (assumendo nomi di file relativamente sani che non contengano newline)

    $ latest=$(ls -tr | tail -n 1)
    

cosa fa l'opzione -tr?
Ashildr

@Ash si ordina in base al tempo ( -t ) in ordine inverso ( -r ) quindi l'ultimo file è il più recente
terdon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.