Один вкладыш для просмотра старых версий файлов в каталоге - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь выработать однострочник 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 также доступна. Однако это должен быть однострочный текст, который можно использовать непосредственно в командной строке.

1 Ответ

2 голосов
/ 07 февраля 2020

Сортировка теперь имеет опцию --version-sort, которая является героем здесь.

#!/bin/bash

# let awk remember the previous file prefix (p1) and previous file name (f1)
# if the current prefix (p2) matches the previous prefix (p1), then 
# print the previous filename (f1)
awk '{
    # remember the previous values
    p1=p2
    f1=f2
    # save the current filename
    f2=$0
    # strip the version and extension
    sub(/[0-9\.]+.[a-z]+$/, "")
    # save as the current prefix
    p2=$0
    if (p1 == p2) {
        # print the previous filename if this prefix is the same as the previous
        print f1
    }
}' <(sort --version-sort <(for f in *.jar; do echo "$f"; done))

А теперь для однострочного:)

awk '{p1=p2; f1=f2; f2=$0; sub(/[0-9\.]+.[a-z]+$/, ""); p2=$0; if (p1==p2) {print f1}}' <(sort -V <(for f in *.jar; do echo "$f"; done))

Результаты:

bar-foo-1.24.jar
foo-2.3-foo-bar-3.1.2.jar
foo-bar-foo-1.2.21.jar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...