Я пытаюсь выработать однострочник linux для вывода списка файлов, которые являются дубликатами файлов более ранних версий в каталоге. Например:
filenames:
foo-bar-foo-1.3.42.jar
foo-bar-foo-1.2.21.jar
foo-2.3-foo-bar-3.1.2.jar
foo-2.3-foo-bar-3.2.4.jar
bar-foo-1.24.jar
bar-foo-2.0.jar
foobar-foobar-3.4.1.jar
barfoo-barfoo-1.2.1.jar
expected output:
foo-bar-foo-1.2.21.jar
foo-2.3-bar-3.1.2.jar
bar-foo-1.24.jar
Это похоже на вопрос https://unix.stackexchange.com/questions/185193/remove-the-low-version-number-of-file, но он полагается на возможность установить файловый разделитель на первом да sh, а мой - на минимум две черточки. У меня был некоторый ограниченный успех, пытаясь настроить его так:
ls -vr *.jar | awk -F-[0-9]+.[0-9]+.[0-9]+ '$1 == name{system ("ls \""$0"\"")}{name=$1}'
, но он пропускает те, в версии которых есть только 2 номера.
и используя это попадает в файлы типа foo-2.3-foo-bar-3.1.2.jar:
ls -vr *.jar | awk -F-[0-9]+.[0-9]+ '$1 == name{system ("ls \""$0"\"")}{name=$1}'
Я также могу использовать gsub для получения переменной, которая содержит все, кроме версии число, но я не могу понять, как использовать его, чтобы в конечном итоге получить мои ожидаемые результаты.
ls -vr *.jar | awk -F- '{gsub("-"$NF,"",$x)}{print $x}'
Я открыт, чтобы не использовать awk, если есть лучшее решение (я я не очень знаком с этим). Я работаю над RHEL в bash с sed также доступна. Однако это должен быть однострочный текст, который можно использовать непосредственно в командной строке.