根据文件名中的版本查找所有旧版本

根据文件名中的版本查找所有旧版本

这与这个问题类似:删除低版本号文件

不幸的是,上述问题的解决方案对我不起作用,例如:

文件 ( ls -vr *.pkg.tar.xz):

wire-desktop-bin-2.11.2700-1-x86_64.pkg.tar.xz
wire-desktop-bin-2.11.2698-1-x86_64.pkg.tar.xz
wire-desktop-bin-2.11.2697-1-x86_64.pkg.tar.xz
webstorm-2016.3.3-1-x86_64.pkg.tar.xz
webstorm-2016.3.2-1-x86_64.pkg.tar.xz
visual-studio-code-1.9.0-1-x86_64.pkg.tar.xz
visual-studio-code-1.8.1-3-x86_64.pkg.tar.xz
pycharm-professional-2016.3.2-1-any.pkg.tar.xz
plasma5-applets-thermal-monitor-git-r63.fd41970-1-any.pkg.tar.xz
masterpdfeditor-qt5-3.7.10-2-x86_64.pkg.tar.xz
masterpdfeditor-4.0.30-1-x86_64.pkg.tar.xz
keepass-plugin-keeagent-0.8.1-3-any.pkg.tar.xz
jre-8u121-1-x86_64.pkg.tar.xz
jdk-8u121-1-x86_64.pkg.tar.xz
jabref-3.8.1-1-any.pkg.tar.xz
intellij-jdk-8u112b719-1-x86_64.pkg.tar.xz
intellij-jdk-8u112b657-1-x86_64.pkg.tar.xz
intellij-idea-ultimate-edition-2016.3.4-1-any.pkg.tar.xz
intellij-idea-ultimate-edition-2016.3.3-1-any.pkg.tar.xz
hstr-git-1.21.r10.gc0d3236-1-x86_64.pkg.tar.xz
google-chrome-56.0.2924.87-1-x86_64.pkg.tar.xz
google-chrome-56.0.2924.76-1-x86_64.pkg.tar.xz
gitinspector-0.4.4-1-any.pkg.tar.xz
dropbox-17.4.33-1-x86_64.pkg.tar.xz
chromium-widevine-1:1.4.8.962-1-x86_64.pkg.tar.xz

现在我需要找到(并稍后删除)所有旧包(版本号!=最高)。

使用另一个问题的解决方案:

ls -vr *.depot | awk -F- '$1 == name{system ("rm \""$0"\"")}{name=$1}'

产生这个错误的结果:

:: os/x86_64 » ls -vr *.pkg.tar.xz | awk -F- '$1 == name{system ("echo \""$0"\"")}{name=$1}'
wire-desktop-bin-2.11.2698-1-x86_64.pkg.tar.xz
wire-desktop-bin-2.11.2697-1-x86_64.pkg.tar.xz
webstorm-2016.3.2-1-x86_64.pkg.tar.xz
visual-studio-code-1.8.1-3-x86_64.pkg.tar.xz
masterpdfeditor-4.0.30-1-x86_64.pkg.tar.xz
intellij-jdk-8u112b657-1-x86_64.pkg.tar.xz
intellij-idea-ultimate-edition-2016.3.4-1-any.pkg.tar.xz <-----------
intellij-idea-ultimate-edition-2016.3.3-1-any.pkg.tar.xz <-----------
google-chrome-56.0.2924.76-1-x86_64.pkg.tar.xz

注意这个列表两个都 idea-ultimate-edition包因为intellij-jdk(awk 首先分裂-)。我真的不知道如何一致地解决这个问题。

这些是 Archlinux 软件包,即使 pacman(Archlinux 软件包管理器)可以在这里帮助我,我正在 Debian 系统上构建和存储它们,所以我更喜欢纯粹的 bash/awk/etc。解决方案。

答案1

您需要一个完整的正则表达式来隔离移动版本字符串。使用未使用的字符分隔基本名称并对其进行唯一排序。

例如,使用 = 作为分隔符构建索引文件:

perl -le 'map { print "$1=$2" if /(\S+)-((\S+-\d+)-(x86_64|any)\.\S+)/ } @ARGV' *.pkg.tar.xz > pkgindex

将其排序为唯一并将分隔符改回:

sort -t= -r -k1,1 -u pkgindex | sed s/=/-/ > freshpkgs

不要忘记用所有已知值(x86_64、i386、任何)填充体系结构字符串!

相关内容