В каталоге у меня есть следующие файлы:
myfile_v01.txt
myfile_v02.txt
myfile_v03.txt
Как сделать bash-скрипт, который определяет значение последней версии и поместить имя файла этой последней версии в переменную?
Не очень изысканно, но кажется функциональным:
var = $(ls | sort -V | tail -n 1)
Тогда у вас есть последний файл, сохраненный в $var
Существует два очевидных подхода: вы можете либо проанализировать имя файла, либо найти последний файл:
Проанализируйте имя файла, это предполагает, что все файлы имеют имена, как в вашем примере:
$ 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
Получить новейший файл (при условии относительно нормальных имен файлов, которые не содержат переводы строк)
$ latest=$(ls -tr | tail -n 1)
Вот решение, которое использует 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
не пострадает от этого ограничения.