각 파일 이름에서 가장 높은 번호의 버전을 선택하는 방법은 무엇입니까?

각 파일 이름에서 가장 높은 번호의 버전을 선택하는 방법은 무엇입니까?

입력하다:

ganglia-3.7.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.7.2-2.el7.x86_64.rpm
ganglia-devel-3.7.2-2.el7.x86_64.rpm
ganglia-gmetad-3.7.2-2.el7.x86_64.rpm
ganglia-gmond-3.7.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.7.2-2.el7.x86_64.rpm
ganglia-web-3.7.1-2.el7.x86_64.rpm
ganglia-3.8.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm
ganglia-devel-3.8.2-2.el7.x86_64.rpm
ganglia-gmetad-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm
ganglia-web-3.8.1-2.el7.x86_64.rpm

출력은 다음과 같아야 합니다.

ganglia-3.8.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm
ganglia-devel-3.8.2-2.el7.x86_64.rpm
ganglia-gmetad-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm
ganglia-web-3.8.1-2.el7.x86_64.rpm

ls -v접두사를 취하고 명령을 사용하여 버전을 얻는 것과 같은 방법을 거쳤습니다 ...

ganglia
ganglia-debuginfo
ganglia-dlevel
ganglia-web
.....

그리고 사용ls -v prefix* | tail -n 1 ..

완벽한 것을 얻을 수 있지만 신경절 접두사가 있어야만 가능합니다. 나는 아무것도 완벽하게 얻을 수 없습니다.

답변1

$ sed -E 's/([a-z])-([[:digit:]]+\.)+/\1 \2/' file |
  sort -k2Vr |
  awk '$1 in a{ next } { a[$1]; print $1 "-" $2 }'
ganglia-8.2-2.el7.x86_64.rpm
ganglia-debuginfo-8.2-2.el7.x86_64.rpm
ganglia-devel-8.2-2.el7.x86_64.rpm
ganglia-gmetad-8.2-2.el7.x86_64.rpm
ganglia-gmond-8.2-2.el7.x86_64.rpm
ganglia-gmond-python-8.2-2.el7.x86_64.rpm
ganglia-web-8.1-2.el7.x86_64.rpm
  • sed-: 이름과 버전 접미사 사이의 첫 번째 문자를 공백 문자로 바꿉니다.
  • sort: 두 번째 필드에서는 버전별로 역순으로 정렬합니다.
  • awk: 이름이 배열에 있으면 줄을 건너뛰고, 그렇지 않으면 배열에 이름을 저장하고 이름 -과 버전 접미사를 인쇄합니다.

답변2

다음은 패키지의 주 버전과 부 버전을 기준으로 정렬하는 데 도움이 될 수 있습니다. 도움이 될 수 있는 아이디어입니다.

$ cat test | sed -e 's/-\([[:alpha:]]\)/+\1/g' |   sort -t - -n -k2 -r | sed -e 's/+\([[:alpha:]]\)/-\1/g'
ganglia-web-3.8.1-2.el7.x86_64.rpm
ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-3.8.2-2.el7.x86_64.rpm
ganglia-gmetad-3.8.2-2.el7.x86_64.rpm
ganglia-devel-3.8.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm
ganglia-3.8.2-2.el7.x86_64.rpm
ganglia-web-3.7.1-2.el7.x86_64.rpm
ganglia-gmond-python-3.7.2-2.el7.x86_64.rpm
ganglia-gmond-3.7.2-2.el7.x86_64.rpm
ganglia-gmetad-3.7.2-2.el7.x86_64.rpm
ganglia-devel-3.7.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.7.2-2.el7.x86_64.rpm
ganglia-3.7.2-2.el7.x86_64.rpm

답변3

그리고 zsh:

typeset -A max_version
for file (*.rpm(nN)) max_version[${file%-*-*.*.*.*}]=$file
print -rC1 -- $max_version

현재 디렉토리의 파일 목록은 *.rpm(nN)숫자로 정렬됩니다. .rpm연관 배열에 패키지의 최대 버전(in)을 기록합니다 .xx-version-packageVersion.rel.arch.rpmmax_version

연관 배열은 다음을 포함하게 됩니다.

$ typeset -p max_version typeset -A max_version=( [ganglia]=ganglia-3.8.2-2.el7.x86_64.rpm [ganglia-debuginfo]=ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm [ganglia-devel]=ganglia-devel-3.8.2-2.el7.x86_64.rpm [ganglia-gmetad]=ganglia-gmetad-3.8.2-2.el7.x86_64.rpm [ganglia-gmond]=ganglia-gmond-3.8.2-2.el7.x86_64.rpm [ganglia-gmond-python]=ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm [ganglia-web]=ganglia-web-3.8.1-2.el7.x86_64.rpm )

관련 정보