如何使用apt-get安装软件包而无需指定特定的软件包?

例如:
以下命令将安装与其模式匹配的所有软件包:
  sudo apt-get install k3b-*

如果我想使用那个指令,但又不想安装一个有损依赖关系的特定软件包,我该怎么做呢?
我尝试过这个方法,但没有成功。
sudo apt-get install "$(apt-cache --no-generate pkgnames k3b | grep -v extrathemes | tr '\n' ' ')" :
 sam@/home/sam/code/ros/ai/cram/roslisp_repl$ sudo apt-get install      "$(apt-cache --no-generate pkgnames k3b | grep -v extrathemes | tr '\n' ' ')"
 Reading package lists... Done
 Building dependency tree       
 Reading state information... Done
 E: Unable to locate package k3b-dbg k3b-data k3b 

 sam@/home/sam/code/ros/ai/cram/roslisp_repl$

谢谢~

2Sam - 我有点困惑 - 你把问题标记为已解决,但又编辑了问题说相反的话...问题到底解决了还是没有解决 - 请根据情况更新一下。 - fossfreedom
是的,enzotib的答案用2个步骤解决了我的问题。但是con-f-use的答案试图用另一种方式来解决我的问题(1个步骤),但存在错误。我想学到更多,所以我修改了原始帖子,让@con-f-use知道我在尝试什么。 - sam
你应该去掉 $(instructions) 周围的双引号。 - enzotib
如果当前目录中有与模式匹配的文件,那么sudo apt-get install k3b-*会失败吗? - svick
我还没有遇到过这种情况,所以我通过删除引号来解决它。 - sam
@svick: 当然,在这种情况下,你至少应该引用*字符。 - enzotib
4个回答

你可以做。
list=$(apt-cache --names-only search ^k3b-* | awk '{ print $1 }' | \
    grep -v bad-pkg)
sudo apt-get install $list

说你不想安装k3b-extrathemes软件包。可能没有实际的方法来做到这一点,除非列出除了这个软件包之外的所有软件包:sudo apt-get install k3b-data k3b-dbg
然而,你可以在某种程度上做到这一点:
sudo apt-get install $(apt-cache --no-generate pkgnames k3b \
    | grep -v extrathemes | tr '\n' ' ')

这不是特别实际的。 apt-cache ... 返回软件包的名称,grep -v PACKAGENAME 排除了这些软件包,tr 命令则将换行符替换为空格。

我已经修改了原始帖子以获取这个指令的结果。为什么无法找到软件包? - sam
你应该去掉 $(instructions) 周围的双引号。 - enzotib

我发现了一个更简单的方法来做这件事:
sudo aptitude install <package>

这将使用aptitude而不是apt-get - 它为您提供更多选项。当您看到类似以下内容时:

The following NEW packages will be installed:
  ...
0 packages upgraded, 12 newly installed, 0 to remove and 0 not upgraded.
Need to get 130 MB/130 MB of archives. After unpacking 216 MB will be used.
Do you want to continue? [Y/n/?]

不要按下 'y' 键,输入以下内容:
-<package_to_skip>

那是一个“-”,后面跟着要跳过的包的名称。然后你可以按照正常方式继续安装。


1新版本不默认安装aptitude,但是你可以通过使用sudo apt-get install aptitude或从软件中心轻松安装它。 - Mechanical snail

你可以轻松地使用apt来完成这个任务;如果你想安装foo但不想安装bar,请按照以下步骤操作:
sudo apt install foo bar-

bar后面添加一个连字符。根据apt-get手册的说明:
如果在软件包名称后附加一个连字符(没有空格),则如果已安装该软件包,则将删除该软件包。同样,可以使用加号来指定要安装的软件包。
这显然适用于将要安装的软件包,以及已经安装的软件包。

有趣的尝试,但在使用apt install mopidy* mopidy-podcast-gpodcast- mopidy-podcast-itunes mopidy-podcast-时失败了。 最终使用了mopidy-[^p].*。 - Tyeth