3

В каталоге у меня есть следующие файлы:

myfile_v01.txt
myfile_v02.txt
myfile_v03.txt

Как сделать bash-скрипт, который определяет значение последней версии и поместить имя файла этой последней версии в переменную?

3 ответа3

10

Не очень изысканно, но кажется функциональным:

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

Тогда у вас есть последний файл, сохраненный в $var

4

Существует два очевидных подхода: вы можете либо проанализировать имя файла, либо найти последний файл:

  1. Проанализируйте имя файла, это предполагает, что все файлы имеют имена, как в вашем примере:

    $ 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. Получить новейший файл (при условии относительно нормальных имен файлов, которые не содержат переводы строк)

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

Вот решение, которое использует globbing (поэтому не использует синтаксический анализ ls), как первое решение terdon, но не требует итерации по всем файлам:

myfiles=(myfile_v*)
lastfile="${myfiles[${#myfiles[@]}-1]}"
unset myfiles

Сначала все соответствующие файлы считываются в массив. Затем последний элемент массива присваивается $lastfile . Наконец, массив больше не нужен, поэтому его можно удалить.

К сожалению, bash (по крайней мере, на сколько мне известно) не поддерживает сортировку результата по globbing #, поэтому этот пример прекрасно работает с заданной вами схемой именования (ровно две цифры, также для версий <10), но не удастся для myfile_v1.txt , myfile_v2.txt , ..., myfile_v10.txt .


# zsh (конечно ;)), поэтому zsh% myfiles=(myfile_v*(n)); lastfile="${myfiles[-1]}"; unset myfiles не пострадает от этого ограничения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .