LINUX.ORG.RU

Bash - найти последнюю версию файла

 , , , ,


0

1

Как найти последнюю версию файла по маске?

В дире лежат файлы, в т.ч. нужные:

sec-getter-1.1-SNAPSHOT.jar
sec-getter-2.0.jar
sec-getter-2.1.0.jar

Нужно получить в переменную (для последующего запуска) файл sec-getter-2.1.0.jar.

Я пока смог вычленить все версии файлов:

ls | grep sec-getter | sed -e 's/\.jar$//' | awk -F"-" '{ print $3 }'

вывод такой:

1.1
2.0
2.1.0

Но вот что делать дальше - не придумал. Можно, в принципе, и на питоне каком-нибудь состряпать… но возможно ли решить задачу башем?

★★★★★

sort:

-V, --version-sort
Sort version numbers. The input lines are treated as file names in form PREFIX VERSION SUFFIX, where SUFFIX matches the regular expression "(.([A-Za-z~][A-Za-z0-9~]*)?)*". The files are compared by their prefixes and versions (leading zeros are ignored in version numbers, see example below). If an input string does not match the pattern, then it is compared using the byte compare function.
For example:

$ ls sort* | sort -V
sort-1.022.tgz
sort-1.23.tgz
sort-1.23.1.tgz
sort-1.024.tgz
sort-1.024.003.
sort-1.024.003.tgz
sort-1.024.07.tgz
sort-1.024.009.tgz
beastie ★★★★★
()

возможно, так…

$ find . -maxdepth 1 -name "sec-getter*" -print | sort -rn | head -1
./sec-getter-2.1.0.jar
bvn13 ★★★★★
() автор топика
Ответ на: комментарий от egorcod

выводит версию, а не имя файла

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от beastie

как-то не очень

$ find . -maxdepth 1 -name "sec-getter*" -print | sort -V | head -1
./sec-getter-1.1-SNAPSHOT.jar

работает так: Bash - найти последнюю версию файла (комментарий)

bvn13 ★★★★★
() автор топика
Последнее исправление: bvn13 (всего исправлений: 1)
Ответ на: комментарий от bvn13

Не стоит, но кого это останавливает) По сабжу ls на for заменить и норм.

gnu_linux
()

Проще некуда, эта задача уже лет 50 решается.

$ ls -1
nope
sec-getter-1.0-SNAPSHOT.jar
sec-getter-1.12.jar
sec-getter-1.1-SNAPSHOT.jar
sec-getter-1.2.jar
sec-getter-2.0.jar
sec-getter-2.1.0.jar
$ ls --sort=version --reverse | grep sec-getter
sec-getter-2.1.0.jar
sec-getter-2.0.jar
sec-getter-1.12.jar
sec-getter-1.2.jar
sec-getter-1.1-SNAPSHOT.jar
sec-getter-1.0-SNAPSHOT.jar
$ ls --sort=version --reverse | grep sec-getter | head -n1
sec-getter-2.1.0.jar

RTFM про сортировку версий: https://www.gnu.org/software/coreutils/manual/html_node/Details-about-version-sort.html

legolegs ★★★★★
()
Ответ на: комментарий от bvn13

Не стоит, если ожидаются имена вида

лол
кек.txt

и

Салтыков-Щедрин М.Е. Повесть о том, как один мужик двух генералов прокормил. (Писано со слов коллежского советника Рудомазина). Отечественные записки, № 2. 1869.pdf

а также на иврите, японском и проч.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от bvn13

Да я и без ссылок это знаю. Но разве в яваразработке такие имена артефактов допустимы? maven какой-нибудь с кукухи не съедет от «a\nnewline»?

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

да нет, конечно, нет там таких имен :)

bvn13 ★★★★★
() автор топика

Да напиши ты стартер на той же яве. Чего ты мучаешься то? :)

turtle_bazon ★★★★★
()

Нужно получить в переменную (для последующего запуска) файл sec-getter-2.1.0.jar.

ls sec-getter-* | sort -V | tail -n1
mord0d ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.