Jawaban:
Tidak terlalu halus tetapi tampaknya fungsional:
var = $ (ls | sort -V | tail -n 1)
Kemudian Anda memiliki file terakhir yang disimpan $var
Berikut adalah solusi yang menggunakan globbing (jadi tidak bergantung pada parsing ls ), seperti solusi terdon pertama, tetapi tidak perlu mengulangi semua file:
myfiles=(myfile_v*)
lastfile="${myfiles[${#myfiles[@]}-1]}"
unset myfiles
Pertama, semua file yang cocok dibaca ke dalam array. Kemudian, elemen terakhir dari array ditugaskan untuk $lastfile
. Akhirnya, array tidak diperlukan lagi, sehingga bisa dihapus.
Sayangnya, bash
(setidaknya untuk pengetahuan saya) tidak mendukung menyortir hasil dari globbing # , jadi contoh ini bekerja dengan baik dengan Anda skema penamaan yang diberikan (tepat dua digit, juga untuk versi <10), tetapi akan gagal untuk myfile_v1.txt
, myfile_v2.txt
, .. ., myfile_v10.txt
.
# zsh
(tentu saja ;)
) tidak, jadi zsh% myfiles=(myfile_v*(n)); lastfile="${myfiles[-1]}"; unset myfiles
tidak akan menderita dari keterbatasan ini.
Ada dua pendekatan yang jelas, Anda dapat mengurai nama file atau mencari file terbaru:
Parsing nama file, ini mengasumsikan semua file diberi nama seperti pada contoh Anda:
$ 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
Dapatkan file terbaru (dengan asumsi nama file yang relatif waras yang tidak mengandung baris baru)
$ latest=$(ls -tr | tail -n 1)
-t
) dalam urutan terbalik ( -r
) sehingga file terakhir adalah yang terbaru