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?

Jawaban:


10

Tidak terlalu halus tetapi tampaknya fungsional:

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

Kemudian Anda memiliki file terakhir yang disimpan $var


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.


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)

apa yang dilakukan opsi -tr?
Ashildr

@ Apakah itu mengurutkan berdasarkan waktu ( -t) dalam urutan terbalik ( -r) sehingga file terakhir adalah yang terbaru
terdon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.