有用的apt(dpkg)命令

请发布您所知道的一些不太常见但非常有用的 apt 命令,包括 apt-*、dpkg 或 aptitude。

7这并不是一个真正的问题。 - Martin Owens -doctormo-
8个回答

一些我经常使用的命令:
查看依赖关系和反向依赖关系:
apt-cache [--important] [--installed] [--recurse] depends $package
apt-cache rdepends $package

要删除一个软件包以及所有自动删除的软件包和相关的配置文件,请执行以下操作:
sudo apt-get --purge --auto-remove purge $package

查看实际的 apt 配置选项:
apt-config dump | less

在命令行上修改选项
$ apt-config dump | grep -i recommend
APT::Install-Recommends "1";
$ sudo apt-get -o APT::Install-Recommends="0" install $package

这只是一个通过命令行指定APT选项的示例,为了避免安装推荐的软件包,您可以使用:
sudo apt-get --no-install-recommends $package

查看所有本地/过时的软件包:
aptitude search ~o

查看已删除但仍有残留配置的软件包:
aptitude search ~c

并将它们移除
sudo aptitude purge ~c

获取所有已安装软件包的列表(dpkg -l有时可能会给出截断的列输出)
dpkg --get-selections | awk '{ print $1 }'

或者

dpkg-query -Wf '${Package}\n'  # other fields available, see man page

拆解、修改然后重新组装一个包裹

dpkg-deb -x file.deb ./dir
cd dir 
dpkg-deb -e ../file.deb
# apply your modification, then... 
cd ..
dpkg-deb -b dir file-new.deb

我经常使用的两个是:
apt-get autoremove <packagename>

这将删除软件包和任何未使用的依赖项,如果您尝试了一个应用程序,然后决定不需要它,并且希望清除多余的内容,这将非常有用。
dpkg -S /path/to/file

告诉我文件是用哪个软件包安装的。
最后,还有一个...
dpkg -l <packagename> | grep ^ii

列出软件包,但只包含已安装的状态为ii的软件包,因此不会显示我已经删除的内容。

如果您希望获取未安装文件的软件包名称(使用dpkg -S命令,但针对非安装的软件包),请安装apt-file并运行:

apt-file search /path/to/file

我发现在使用dpkg -S时,结合使用which非常有用。例如:对于存在不同名称的软件包中的可执行文件,可以这样使用:dpkg -S \which uname``。 - Benjamin Rubin
哦,是的,那也是个好选择。 - popey

查看软件包的变更日志
$ aptitude changelog <pkgname>

例子:

$ aptitude changelog sudo
sudo (1.7.0-1ubuntu2.4) karmic-security; urgency=low

  * SECURITY UPDATE: properly handle multiple PATH variables when using
    secure_path in env.c
    - Adapted http://www.sudo.ws/repos/sudo/raw-rev/a09c6812eaec
    - CVE-2010-1646
...

2从Ubuntu 11.04 Natty开始,apt-get changelog sudo也可以使用。 - Lekensteyn

安装 apt-file,然后运行 sudo apt-file update。现在你可以搜索你甚至没有安装的包中的文件。

如果你需要了解其他版本的 Ubuntu 中的软件包信息,也可以使用 devscripts 包中的 rmadison 命令。将软件包名称作为参数提供给它,它会告诉你该软件包在当前所有 Ubuntu 版本中的哪些版本存在,并且该软件包所在的存储库部分。

示例:

[bnrubin@server:~/]$ rmadison cowsay
    cowsay |     3.03-8 | dapper/universe | source, all
    cowsay |     3.03-9 | hardy/universe | source, all
    cowsay |   3.03-9.2 | jaunty/universe | source, all
    cowsay |   3.03-9.2 | karmic/universe | source, all
    cowsay |   3.03-9.2 | lucid/universe | source, all
    cowsay | 3.03+dfsg1-2 | maverick/universe | source, all
    cowsay | 3.03+dfsg1-2 | natty/universe | source, all

apt-file现在能够管理用户数据库,因此您不需要成为root用户即可进行更新。 - enzotib
apt-file 很不错。谢谢分享。 - Gödel

我喜欢将软件包分为三种不同类型:
  • 系统软件包(必要软件包或优先级标准或更高的软件包)
  • 用户软件包(手动安装的优先级可选或额外软件包)
  • 依赖和推荐软件包(自动安装的软件包/除了系统软件包和用户软件包之外的所有内容)
要显示所有的"系统软件包",您可以使用以下命令:
aptitude search '(~pstandard|~pimportant|~prequired|~E)'

我喜欢将它们全部安装并标记为手动安装。
aptitude install '(~pstandard|~pimportant|~prequired|~E)!~i'
aptitude unmarkauto '(~pstandard|~pimportant|~prequired|~E)~i~M'

要显示所有的“用户套餐”,请使用以下命令
aptitude search '~i!~M!(~pstandard|~pimportant|~prequired|~E)'

在这个列表中,应该只包含你确定需要的软件包。所有其他软件包可能只是其他软件包的依赖项或推荐项,你可以将它们标记为自动安装。
aptitude markauto libsomething

请查看aptitude的搜索术语参考
什么是必要、必需、重要、标准、可选或额外的软件包?以获取背景信息。

要获取以'apt-'开头的命令列表,您可以按照以下步骤操作。 打开终端并输入'apt-',然后按两次TAB键,这将列出所有以'apt-'开头的命令。
示例输出:
apt-add-repository    apt-extracttemplates  apt-key
apt-cache             apt-file              apt-mark
apt-cdrom             apt-ftparchive        apt-sortpkgs
apt-config            apt-get 

要获取详细信息,您可以查看特定命令的man页面。
例如:man apt-get

  • 升级软件包,因为它们会删除其他软件包或者是内核升级而被保留:

    sudo apt-get dist-upgrade
    
  • 彻底删除一个软件包及其配置文件。

    sudo apt-get purge package
    
  • 显示软件包在软件包数据库中的详细信息,包括分类、版本、依赖关系、维护者和描述。

    apt-cache show package
    
  • 列出已安装软件包中的文件。

    dpkg -L pkg
    
  • 升级所有软件包。

    sudo apt-get upgrade
    

dpkg -i --force-architecture something.i386.deb

安装一些i386的deb包到amd64上。