Linux dpkg-divert命令介绍
dpkg-divert是一个用来设置和更新文件转移列表的工具。文件转移是一种强制dpkg(1)不将文件安装到其原本的位置,而是转移到另一个位置的方法。文件转移可以通过Debian包脚本来在文件发生冲突时将其移走。系统管理员也可以用它来覆盖某个包的配置文件,或者在安装一个包含这些文件的新版本的包时,让dpkg保留这些文件(这些文件不是被标记为“conffiles”的文件)。
Linux dpkg-divert命令适用的Linux版本
dpkg-divert命令主要适用于基于Debian的Linux发行版,如Ubuntu, Debian, Kali等。如果你使用的是其他的Linux发行版,如CentOS, Fedora, Arch等,你可能需要使用其他的包管理工具,如yum, dnf, pacman等,来处理文件转移的问题。不同的Linux命令可以以选项卡的形式展示,如下:
# Ubuntu/Debian/Kali
[linux@bashcommandnotfound.cn ~]$ dpkg-divert [option ...] command
# CentOS/Fedora
[linux@bashcommandnotfound.cn ~]$ yum install yum-utils
[linux@bashcommandnotfound.cn ~]$ yumdownloader [package]
[linux@bashcommandnotfound.cn ~]$ rpm -ivh --replacefiles [package].rpm
# Arch
[linux@bashcommandnotfound.cn ~]$ pacman -S pacman-contrib
[linux@bashcommandnotfound.cn ~]$ pacdiff [option ...]
Linux dpkg-divert命令的基本语法
dpkg-divert命令的基本语法格式如下:
dpkg-divert [option ...] command
Linux dpkg-divert命令的常用选项或参数说明
dpkg-divert命令的常用选项或参数说明如下表所示:
选项/参数 | 说明 |
---|---|
--add file | 添加一个文件的转移,file是要转移的文件的路径 |
--remove file | 移除一个文件的转移,file是要移除转移的文件的路径 |
--list [glob-pattern] | 列出所有的转移,或者匹配glob-pattern的转移 |
--listpackage file | 打印出转移file的包的名称,如果file是本地转移的,打印LOCAL,如果file没有被转移,什么都不打印 |
--truename file | 打印出一个被转移文件的真实名称 |
--divert divert-to | divert-to是其他包提供的file的版本被转移到的位置 |
--local | 指定所有包的版本的这个文件都被转移,这意味着没有例外,无论安装了什么包,这个文件都被转移,这可以被管理员用来安装一个本地修改的版本 |
--package package | package是一个包的名称,它的file的副本不会被转移,即file只为除了package之外的所有包转移 |
--quiet | 安静模式,即不输出详细信息 |
--rename | 实际地将文件移走(或移回),如果目标文件已经存在,dpkg-divert会中止操作,这是非Essential包集合的文件转移的常见行为 |
--no-rename | 指定在添加或移除转移到数据库时,文件不应该被重命名,这是用于Essential包集合的文件转移的,因为原始文件的暂时消失是不可接受的,它可能会导致系统不可用 |
--test | 测试模式,即不实际执行任何改变,只是演示 |
-?, --help | 显示使用信息并退出 |
Linux dpkg-divert命令的实例
实例1:添加一个本地转移
如果我们想要将/usr/bin/ls命令转移到/usr/bin/ls.real,并安装一个自定义的ls命令,我们可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --local --add --rename --divert /usr/bin/ls.real /usr/bin/ls
Adding 'local diversion of /usr/bin/ls to /usr/bin/ls.real'
这样,我们就可以将自定义的ls命令放到/usr/bin/ls,而不影响其他包提供的ls命令。
实例2:移除一个本地转移
如果我们想要恢复原来的/usr/bin/ls命令,我们可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --local --remove --rename /usr/bin/ls
Removing 'local diversion of /usr/bin/ls to /usr/bin/ls.real'
这样,我们就可以将/usr/bin/ls.real移回到/usr/bin/ls,而不影响其他包提供的ls命令。
实例3:添加一个包转移
如果我们想要将一个包的文件转移,我们可以使用--package选项来指定这个包的名称。例如,如果我们想要将vim-tiny包的/usr/bin/vi命令转移到/usr/bin/vi.vim-tiny,并安装vim包的/usr/bin/vi命令,我们可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --package vim-tiny --add --rename --divert /usr/bin/vi.vim-tiny /usr/bin/vi
Adding 'diversion of /usr/bin/vi to /usr/bin/vi.vim-tiny by vim-tiny'
这样,我们就可以安装vim包,而不会覆盖vim-tiny包的vi命令。
实例4:移除一个包转移
如果我们想要恢复一个包的文件转移,我们可以使用--package选项来指定这个包的名称。例如,如果我们想要恢复vim-tiny包的/usr/bin/vi命令,我们可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --package vim-tiny --remove --rename /usr/bin/vi
Removing 'diversion of /usr/bin/vi to /usr/bin/vi.vim-tiny by vim-tiny'
这样,我们就可以卸载vim包,而不会影响vim-tiny包的vi命令。
实例5:列出所有的转移
如果我们想要查看系统中有哪些文件被转移了,我们可以使用--list选项来列出所有的转移。例如:
[linux@bashcommandnotfound.cn ~]$ dpkg-divert --list
diversion of /usr/bin/ls to /usr/bin/ls.real by local
diversion of /usr/bin/vi to /usr/bin/vi.vim-tiny by vim-tiny
diversion of /usr/share/man/man1/vi.1.gz to /usr/share/man/man1/vi.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/view.1.gz to /usr/share/man/man1/view.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/ex.1.gz to /usr/share/man/man1/ex.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/editor.1.gz to /usr/share/man/man1/editor.vim-tiny.1.gz by vim-tiny
diversion of /usr/bin/pager to /usr/bin/pager.distrib by local
diversion of /usr/bin/sensible-editor to /usr/bin/sensible-editor.distrib by local
diversion of /usr/bin/sensible-pager to /usr/bin/sensible-pager.distrib by local
我们可以看到,有些文件是被本地转移的。
实例6:列出匹配模式的转移
如果我们想要查看系统中有哪些文件被转移了,我们可以使用--list选项来列出所有的转移。如果我们想要只列出匹配某个模式的转移,我们可以使用glob-pattern参数来指定这个模式。例如,如果我们想要列出所有以vi开头的文件的转移,我们可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ dpkg-divert --list vi*
diversion of /usr/bin/vi to /usr/bin/vi.vim-tiny by vim-tiny
diversion of /usr/share/man/man1/vi.1.gz to /usr/share/man/man1/vi.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/view.1.gz to /usr/share/man/man1/view.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/ex.1.gz to /usr/share/man/man1/ex.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/editor.1.gz to /usr/share/man/man1/editor.vim-tiny.1.gz by vim-tiny
我们可以看到,有些文件是被vim-tiny包转移的,而不是被本地转移的。
实例7:打印出转移文件的包的名称
如果我们想要知道一个文件是被哪个包转移的,我们可以使用--listpackage选项来打印出这个包的名称。例如,如果我们想要知道/usr/bin/vi是被哪个包转移的,我们可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ dpkg-divert --listpackage /usr/bin/vi
vim-tiny
我们可以看到,/usr/bin/vi是被vim-tiny包转移的。
实例8:打印出一个被转移文件的真实名称
如果我们想要知道一个被转移文件的真实名称,我们可以使用--truename选项来打印出这个名称。例如,如果我们想要知道/usr/bin/vi的真实名称,我们可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ dpkg-divert --truename /usr/bin/vi
/usr/bin/vi.vim-tiny
我们可以看到,/usr/bin/vi的真实名称是/usr/bin/vi.vim-tiny。
实例9:测试模式
如果我们想要在添加或移除转移时,不实际执行任何改变,只是演示,我们可以使用--test选项来开启测试模式。例如,如果我们想要测试将/usr/bin/ls命令转移到/usr/bin/ls.real,但不实际执行,我们可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --local --add --rename --divert /usr/bin/ls.real /usr/bin/ls --test
Adding 'local diversion of /usr/bin/ls to /usr/bin/ls.real'
我们可以看到,dpkg-divert会显示它将要做的操作,但不会实际执行。
实例10:安静模式
如果我们想要在添加或移除转移时,不输出详细信息,只是安静地执行,我们可以使用--quiet选项来开启安静模式。例如,如果我们想要安静地将/usr/bin/ls命令转移到/usr/bin/ls.real,我们可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --local --add --rename --divert /usr/bin/ls.real /usr/bin/ls --quiet
我们可以看到,dpkg-divert不会输出任何信息,只是执行操作。
Linux dpkg-divert命令的注意事项
- dpkg-divert命令需要root权限,所以我们需要使用sudo或者su来执行它。
- dpkg-divert命令只能转移文件,不能转移目录或者符号链接。
- dpkg-divert命令不会检查文件的内容,所以如果我们转移了一个文件,但是它的内容被修改了,dpkg-divert不会知道,也不会恢复它的原始内容。
- dpkg-divert命令不会自动创建转移目标的目录,所以我们需要确保转移目标的目录存在,或者手动创建它。
- dpkg-divert命令不会自动处理文件的依赖关系,所以我们需要注意转移文件可能会影响其他包的功能,或者导致一些错误。
- 如果我们遇到了bash: dpkg-divert: command not found的错误,我们可以安装dpkg-dev包。
评论区