Dapatkan nama file terakhir dalam variabel di bash?

3

Dalam sebuah direktori, saya memiliki file-file berikut:

myfile_v01.txt
myfile_v02.txt
myfile_v03.txt

Bagaimana cara membuat skrip bash yang mendeteksi nilai versi terakhir dan memasukkan nama file versi terakhir ini ke dalam variabel?

Vincent
sumber

Jawaban:

10

Tidak terlalu halus tetapi tampaknya fungsional:

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

Kemudian Anda memiliki file terakhir yang disimpan $var

Erathiel
sumber
2
fyi: Mengapa Anda tidak perlu menguraikan output ls (1): mywiki.wooledge.org/ParsingLs
MarZab
@ MarsZab Ya, Anda benar. Saya sudah melihat artikel itu dan memang memiliki beberapa poin yang valid.
Erathiel
4

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 myfilestidak akan menderita dari keterbatasan ini.

mpy
sumber
4

Ada dua pendekatan yang jelas, Anda dapat mengurai nama file atau mencari file terbaru:

  1. 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
  2. Dapatkan file terbaru (dengan asumsi nama file yang relatif waras yang tidak mengandung baris baru)

    $ latest=$(ls -tr | tail -n 1)
terdon
sumber
apa yang dilakukan opsi -tr?
Ashildr
@ Apakah itu mengurutkan berdasarkan waktu ( -t) dalam urutan terbalik ( -r) sehingga file terakhir adalah yang terbaru
terdon