我有一个不同版本的 deb 目录列表。我的要求是找到具有匹配版本的包。
这是我到目前为止所尝试的
ls debs/* | grep 1.1.16 | egrep -e 'Package1|Package2|package3'
上面的命令只给我 Package1 的 o/p。
尝试了所有的选项从这里。但它们都没有帮助。
答案1
第一的,关于不解析的常规警告ls
。也就是说,假设您的文件命名合理,您可以这样做:
ls debs/*1.1.16* | grep -E 'Package1|Package2|package3'
这里唯一的区别是,我避免使用第一个 grep,这是不必要的,因为你可以直接将 glob 模式传递给ls
。然后,egrep
我使用已弃用的 ,grep -E
它是同样的东西。
但是,这与您的命令本质上相同。如果不起作用,则说明您没有匹配的文件:
$ ls debs/
1.1.16.Package3 Package1.1.1.160 Package1.1.2.16 Package2.1.1.16
$ ls debs/*1.1.16* | grep -E 'Package1|Package2|package3'
debs/Package1.1.1.160
debs/Package2.1.1.16
正如预期的那样,这显示了两个匹配的文件。这正是您的命令打印的内容:
$ ls debs/* | grep 1.1.16 | egrep -e 'Package1|Package2|package3'
debs/Package1.1.1.160
debs/Package2.1.1.16
请注意,由于模式中的package3
是小写(p
而不是P
) ,因此不会显示grep
该文件。1.1.16.Package3
答案2
有一种方法可以在不削减ls
输出的情况下做到这一点。
version=1.1.16
for package in debs/*Package1*${version}* \
debs/*Package2*${version}* \
debs/*package3*${version}*;
do
action with $package;
done
这样 shell 将扩展 glob 并迭代匹配的文件。如果没有文件与提供的模式匹配,脚本将简单地跳过循环而不会出现任何错误。
或者尝试find
:
version=1.1.16
find debs/ \( -name "*Package1*${version}*" -o -name "*Package2*${version}*" -o -name "*package3*${version}*" \)